Easy Tutorial
❮ C If C Examples Calculator Switch Case ❯

C Sorting Algorithms

Bubble Sort

Bubble Sort (English: Bubble Sort) is a simple sorting algorithm. It repeatedly steps through the list, compares adjacent elements, and swaps them if they are in the wrong order.

Example

#include <stdio.h>
void bubble_sort(int arr[], int len) {
    int i, j, temp;
    for (i = 0; i < len - 1; i++)
        for (j = 0; j < len - 1 - i; j++)
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
}
int main() {
    int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
    int len = (int) sizeof(arr) / sizeof(*arr);
    bubble_sort(arr, len);
    int i;
    for (i = 0; i < len; i++)
        printf("%d ", arr[i]);
    return 0;
}

Selection Sort

Selection sort is a simple and intuitive sorting algorithm. It works by selecting the smallest (or largest) element from the unsorted portion of the list and moving it to the end of the sorted portion.

Example

void selection_sort(int a[], int len) 
{
    int i,j,temp;

    for (i = 0 ; i < len - 1 ; i++) 
    {
        int min = i;                  // Record the smallest value, defaulting to the first element
        for (j = i + 1; j < len; j++)     // Access the unsorted elements
        {
            if (a[j] < a[min])    // Find the current smallest value
            {
                min = j;    // Record the smallest value
            }
        }
        if(min != i)
        {
            temp=a[min];  // Swap two variables
            a[min]=a[i];
            a[i]=temp;
        }
    }
}

Insertion Sort

Insertion Sort is a simple and intuitive sorting algorithm. It works by building a sorted sequence one element at a time, inserting each new element into its correct position within the sorted sequence.

Example

void insertion_sort(int arr[], int len){
    int i,j,temp;
    for (i=1;i&lt;len;i++){
            temp = arr[i];
            for (j=i;j>0 && arr[j-1]>temp;j--)
                    arr[j] = arr[j-1];
            arr[j] = temp;
    }
}

Shell Sort

Shell Sort, also known as the Diminishing Increment Sort, is an improved version of the Insertion Sort. It is not a stable sorting algorithm.

Shell Sort is based on the following properties of Insertion Sort:

Example

void shell_sort(int arr[], int len) {
    int gap, i, j;
    int temp;
    for (gap = len >> 1; gap > 0; gap = gap >> 1)
        for (i = gap; i < len; i++) {
            temp = arr[i];
            for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
                arr[j + gap] = arr[j];
            arr[j + gap] = temp;
        }
}

Merge Sort

Merge Sort divides the data into two segments and selects the smallest elements from each segment to append to the new data segment.

This can be done either top-down or bottom-up.

Iterative Method

int min(int x, int y) {
    return x < y ? x : y;
}
void merge_sort(int arr[], int len) {
    int* a = arr;
    int* b = (int*) malloc(len * sizeof(int));
    int seg, start;
    for (seg = 1; seg < len; seg += seg) {
        for (start = 0; start < len; start += seg + seg) {
            int low = start, mid = min(start + seg, len), high = min(start + seg + seg, len);
            int k = low;
            int start1 = low, end1 = mid;
            int start2 = mid, end2 = high;
            while (start1 < end1 && start2 < end2)
                b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
            while (start1 < end1)
                b[k++] = a[start1++];
            while (start2 < end2)
                b[k++] = a[start2++];
        }
        int* temp = a;
        a = b;
        b = temp;
    }
    if (a != arr) {
        int i;
        for (i = 0; i < len; i++)
            b[i] = a[i];
        b = a;
    }
    free(b);
}

Recursive Method

void merge_sort_recursive(int arr[], int reg[], int start, int end) {
    if (start >= end)
        return;
    int len = end - start, mid = (len >> 1) + start;
    int start1 = start, end1 = mid;
    int start2 = mid + 1, end2 = end;
    merge_sort_recursive(arr, reg, start1, end1);
    merge_sort_recursive(arr, reg, start2, end2);
    int k = start;
    while (start1 <= end1 && start2 <= end2)
        reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
    while (start1 <= end1)
        reg[k++] = arr[start1++];
    while (start2 <= end2)
        reg[k++] = arr[start2++];
    for (k = start; k <= end; k++)
        arr[k] = reg[k];
}
void merge_sort(int arr[], const int len) {
    int reg[len];
    merge_sort_recursive(arr, reg, 0, len - 1);
}

Quick Sort

Quick Sort selects a random element as a pivot, places elements smaller than the pivot before it, and elements larger than the pivot after it, and then sorts the smaller and larger segments.

Iterative Method

typedef struct _Range {
    int start, end;
} Range;
Range new_Range(int s, int e) {
    Range r;
    r.start = s;
    r.end = e;
    return r;
}
void swap(int *x, int *y) {
    int t = *x;
    *x = *y;
    *y = t;
}
void quick_sort(int arr[], const int len) {
    if (len <= 0)
        return; // Avoid Segment Fault when len is negative
    // r[] simulates list, p is quantity, r[p++] is push, r[--p] is pop and get element
    Range r[len];
    int p = 0;
    r[p++] = new_Range(0, len - 1);
    while (p) {
        Range range = r[--p];
        if (range.start >= range.end)
            continue;
        int mid = arr[(range.start + range.end) / 2]; // Select midpoint as pivot
        int left = range.start, right = range.end;
        do
        {
            while (arr[left] < mid) ++left;   // Check if elements on the left side of the pivot meet the requirement
            while (arr[right] > mid) --right; // Check if elements on the right side of the pivot meet the requirement

            if (left <= right)
                swap(&arr[left], &arr[right]);
                left++;
                right--;              
        } while (left <= right);
        if (range.start < right) r[p++] = new_Range(range.start, right);
        if (range.end > left) r[p++] = new_Range(left, range.end);
    }
}
swap(&arr[left], &arr[right]);
left++; right--; // Move pointers to continue
}
} while (left <= right);

if (range.start < right) r[p++] = new_Range(range.start, right);
if (range.end > left) r[p++] = new_Range(left, range.end);
}
}

Recursive Method

void swap(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}
void quick_sort_recursive(int arr[], int start, int end) {
if (start >= end)
return;
int mid = arr[end];
int left = start, right = end - 1;
while (left < right) {
while (arr[left] < mid && left < right)
left++;
while (arr[right] >= mid && left < right)
right--;
swap(&arr[left], &arr[right]);
}
if (arr[left] >= arr[end])
swap(&arr[left], &arr[end]);
else
left++;
if (left)
quick_sort_recursive(arr, start, left - 1);
quick_sort_recursive(arr, left + 1, end);
}
void quick_sort(int arr[], int len) {
quick_sort_recursive(arr, 0, len - 1);
}
❮ C If C Examples Calculator Switch Case ❯