排序算法總結

常用算法的特點總結:

排序算法 平均時間複雜度 最好情況 最壞情況 空間複雜度 排序方式 穩定性
冒泡排序 O(n2)O(n^2) O(n)O(n) O(n2)O(n^2) O(1)O(1) 內排序 穩定
選擇排序 O(n2)O(n^2) O(n2)O(n^2) O(n2)O(n^2) O(1)O(1) 內排序 不穩定
插入排序 O(n2)O(n^2) O(n)O(n) O(n2)O(n^2) O(1)O(1) 內排序 穩定
希爾排序 O(n1.3)O(n^{1.3}) O(n)O(n) O(n2)O(n^2) O(1)O(1) 內排序 不穩定
歸併排序 O(n2)O(n^2) O(n)O(n) O(n2)O(n^2) O(1)O(1) 內排序 穩定
快速排序 O(n2)O(n^2) O(n)O(n) O(n2)O(n^2) O(1)O(1) 內排序 穩定
堆排序 O(n2)O(n^2) O(n)O(n) O(n2)O(n^2) O(1)O(1) 內排序 穩定
計數排序 O(n2)O(n^2) O(n)O(n) O(n2)O(n^2) O(1)O(1) 內排序 穩定
桶排序 O(n2)O(n^2) O(n)O(n) O(n2)O(n^2) O(1)O(1) 內排序 穩定
基數排序 O(n2)O(n^2) O(n)O(n) O(n2)O(n^2) O(1)O(1) 內排序 穩定

插入排序
向一個有序數組a[n]中插入一個新元素x,使得新的數組a[n+1]依然是一個有序數組;

算法實現思路:
1、找到新元素x在有序數組a[n]中的大小位置:從有序數組a[0]開始循環,與x比較大小,當x小於數組中的值時,停止循環,記錄數組下標index;
2、將數組中大於x的數全部向後移動一個單位的長度;
3、將新元素插入index所在的位置;

代碼實現:

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

上述代碼來自極客時間專欄《數據結構與算法之美》的第11節。
插入排序算法的實現有很多種,每個人的實現方式都不盡相同,但上述這種是目前已知代碼比較簡潔,效率較高的一種實現;

冒泡排序
依次比較相鄰兩個元素的大小,若前面的元素較大,則交換兩個元素的位置,否則不交換。

代碼實現

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

希爾排序

void shell_sort(int a[], const int n) {
    for(int k = n / 2; k > 0; k /= 2) {
        for (int i = k; i < n; i++) {
            int temp = a[i];
            int j = i;
            for (; j >= k && a[j - k] > temp; j-= k) {
                a[j] = a[j-k];
            }
            a[j] = temp;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章