各類排序算法(原理和代碼實現)

1.選擇排序

含義:對一個序列 A 中的元素 A[1] ~ A[n] ,令 i 從 1 到 n 枚舉,進行 n 趟操做,每趟從待排序部分 [i, n] 中選擇最小的元素,令其與待排序部分的第一個元素 A[i] 進行交換,這樣元素 A[i]就會與當前有序區間 [1, i -1]造成新的有序區間 [1, i]。
示意圖:
image.png
代碼:(複雜度:O(n^2) )c++

#include <cstdio>

void select_sort(int a[], int n)
{
    for (int i = 0; i < n; i ++)
    {
        int k = i;
        for (int j = i; j < n; j ++)
        {
            if (a[j] < a[k])
                k = j;
        }
        int temp = a[k];
        a[k] = a[i];
        a[i] = temp;
    }
}

int main()
{
    int a[5] = {5, 4, 3, 2, 1};
    int len = sizeof(a) / sizeof(int);
    
    select_sort(a, len);
    
    for (int i = 0; i < len; i ++)
        printf("%d ", a[i]);
    
    return 0;
}

2.插入排序

含義: 對序列 A 的 n 個元素A [1] ~ A[n],令 i 從 2 到 n 枚舉,進行 n - 1 趟操做。假設某一趟是,序列 A 的前 n 個元素 A[1] ~ A[i - 1]已經有序,而範圍 [i, n]還未有序,那麼該趟從範圍 [1, i - 1] 中尋找某個位置 j ,使得將 A[i] 插入位置 j 後(A[j] 以後的元素都會後移一位),範圍 [1, i] 有序。
示意圖:
image.png
代碼:算法

#include <cstdio>

void insert_sort(int a[], int n)
{
    for (int i = 1; i < n; i ++)
    {
        int temp = a[i], j = i; // temp 臨時存放a[i], j 從 i 開始向前枚舉
        while(j > 0 && temp < a[j - 1])
        {
            a[j] = a[j - 1];
            j --;
        }
        a[j] = temp;
    }
}

int main()
{
    int a[5] = {5, 4, 3, 2, 1};
    
    int len = sizeof(a) / sizeof(int);
    
    insert_sort(a, len);
    for (int i = 0; i < len; i ++ )
        printf("%d ", a[i]);
    
    return 0;    
}

3.冒泡排序

含義:在一個序列中,從首元素開始,進行兩兩互換使最大的元素放在序列的最後。這樣 n 個元素的序列須要進行 n - 1 趟交換。第一趟交換的次數是 n - 1 次,第二趟交換的次數是 n - 2 次...則第 i 趟交換的次數是 n - i 次。
代碼:spa

#include <cstdio>

void bubble_sort(int a[], int n)
{
    for (int i = 0; i < n - 1; i ++)
        for (int j = 0; j < n - i - 1; j ++)
            if (a[j] > a[j + 1])
            {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
}

int main()
{
    int a[5] = {5, 4, 3, 2, 1};
    
    int len = sizeof(a) / sizeof(int);
    bubble_sort(a, len);
    
    for (int i = 0; i < len; i ++)
        printf("%d ", a[i]);
    
    return 0;
}
參考資料《算法筆記》胡凡.
相關文章
相關標籤/搜索