# Concise campaign of sorting algorithm
### 1. Bubble Sort
The first sort we learn
```c=
int *bubble_sort(int *array, int array_size) {
for (int pass = 1; pass < array_size; pass++) { // scan from first to last
for (int compare_index = 0; compare_index < array_size - pass; compare_index++) { // compare the two elements to see which one is greater
if (array[compare_index] > array[compare_index + 1]) {
swap(&array[compare_index], &array[compare_index + 1]); // swap two elements if the next element is smaller than the compare one
}
}
}
return *array;
}
void swap(int *address_a, int *address_b) { // swap two elements
int temp = *address_a;
*address_a = *address_b;
*address_b = temp;
}
```
### 2. Insertion Sort
Slow but easy
```c=
int *insertion_sort(int *array, int array_size) {
for (int compare_index = 1; compare_index < array_size; compare_index++) {
int key = array[compare_index]; // set key from first to last
int compare_key;
for (compare_key = compare_index - 1; compare_key >= 0 && array[compare_key] > key; compare_key--) {
array[compare_key + 1] = array[compare_key]; // move left if array[compare_key] is greater than the key
}
array[compare_key + 1] = key; // move key back
}
return *array;
}
```
### 3. Selection Sort
Slow but easy
```c=
int *selection_sort(int *array, int array_size) {
for (int compare_index = 0; compare_index < array_size; compare_index++) {
int min = array[compare_index]; // set min as the first element
int min_index = compare_index; // set min_index as the first index
for (int find_min = compare_index + 1; find_min < array_size; find_min++) {
if (array[find_min] < min) {
min = array[find_min]; // set new min as the element which is smaler than the original one
min_index = find_min; // set new min_index as the element_index
}
}
swap(&array[compare_index], &array[min_index]); // swap the array[compare_index] with the min one
}
return *array;
}
void swap(int *address_a, int *address_b) { // swap two elements
int temp = *address_a;
*address_a = *address_b;
*address_b = temp;
}
```
### 4. Quick Sort
Slow a bit and a bit hard
```c=
void quickSort(int* arr, int start, int end) {
if (start < end) { // if start == end, the sort ends
int pivot = partition(arr, start, end); // find the pivot point
quickSort(arr, start, pivot - 1); // sort the array on the left side of the pivot
quickSort(arr, pivot + 1, end); // sort the array on the right side of the pivot
}
}
int partition(int* arr, int start, int end) {
int pivot = arr[end]; // set pivot as the end element
int left_index = start - 1; // locate the left_index
for (int compare_index = start; compare_index < end; compare_index++) {
if (arr[compare_index] < pivot) {
left_index++;
swap(&arr[left_index], &arr[compare_index]); // move left if &arr[compare_index] is smaller than the pivot
}
}
swap(&arr[left_index + 1], &arr[end]); // left_index + 1 == the location of pivot, swap pivot with the element at left_index + 1
return left_index + 1; // return the location of pivot
}
void swap(int* address_a, int* address_b) { // swap two elements
int temp = *address_a;
*address_a = *address_b;
*address_b = temp;
}
```