1. 程式人生 > >三種常見的排序算法

三種常見的排序算法

合並算法 合並 參考 amp 實現 insert 算法 clas 屬於

原理請參考《算法導論》

插入式排序算法實現:

void insertion_sort(int *A, int length) {
    int i, key;
    for (int j = 1; j < length; j++) {//從第二個開始判斷,保證前面有序
        key = A[j];
        i = j - 1;
        while (i >= 0 && A[i] > key) {
            A[i + 1] = A[i];
            i--;
        }
        A[i + 1
] = key;//插入 } }

遞歸實現分治,merge函數實現合並算法實現:

void merge(int *A, int p, int q, int r) {//q屬於[q, r]
    //分治保證L, R數組是有序的
    int n1, n2, *L, *R, i, j;
    n1 = q - p + 1;//[p, q]
    n2 = r - q;//(q, r]
    L = new int[n1];
    R = new int[n2];
    for (i = 0; i < n1; i++)
        L[i] = A[p + i];
    for (j = 0
; j < n2; j++) R[j] = A[q + 1 + j]; i = j = 0; for (int k = p; k <= r; k++) { if (j == n2)//任意一邊選完了,直接進去 A[k] = L[i++]; else if (i == n1) A[k] = R[j++]; else { if (L[i] < R[j]) A[k] = L[i++];
else A[k] = R[j++]; } } delete[] L; delete[] R; }
void merge_sort(int *A, int p, int r) {//p=0, r=n-1
    if (p < r) {
        //遞歸實現分治,和二叉樹一樣,p<r自動實現過濾沒有用的節點
        merge_sort(A, p, (p + r) / 2);
        merge_sort(A, (p + r) / 2 + 1, r);
        merge(A, p, (p + r) / 2, r);//此函數實現合並
    }
}

冒泡算法實現:

void bubble_sort(int *A, int length) {
    int mid;
    for (int i = 0; i < length; i++) {
        for (int j = length - 1; j > i; j--)
            if (A[j] < A[j - 1]) {//雙雙相比
                mid = A[j];
                A[j] = A[j - 1];
                A[j - 1] = mid;
            }
    }
}

所有代碼均經過測試,結果正確。

三種常見的排序算法