排序算法總結(jié) - C++

冒泡排序: 主要原理是每次兩兩比較,大的往下沉。代碼實現(xiàn)如下:

void BubbleSort(int array[], int len) {
    bool isSwap;
    for (int i = 0; i < len; i++) {
        isSwap = false;
        for (int j = 0; j < len - 1 - i; j++) {
            if (array[j] > array[j + 1]) {
                int temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
                isSwap = true;
            }
        }
        if (!isSwap) {
            break;
        }
    }
}

選擇排序:每一次從待排序的數(shù)據(jù)元素中選出最小的一個元素,存放在序列的起始位置,直到全部待排序的元素排完。代碼實現(xiàn)如下:

void SelectionSort(int array[], int len) {
    int index;
    for (int i = 0; i < len - 1; i++) {
        index = i;
        for (int j = i + 1; j < len; j++) {
            if (array[index] > array[j]) {
                index = j;
            }
        }
        if (index != i) {
            int temp = array[i];
            array[i] = array[index];
            array[index] = temp;
        }
    }
}

插入排序:每步將一個待排序的記錄,按其關(guān)鍵碼的大小插入前面已經(jīng)排序的隊列適當(dāng)位置上,直到全部插入完為止。代碼實現(xiàn)如下:

void InsertSort(int array[], int len) {
    for (int i = 1; i < len; i++) {
        int temp = array[i];
        int j = i;
        while (array[j - 1] > temp && j > 0) {
            array[j] = array[j - 1];
            j--;
        }
        array[j] = temp;
    }
}

桶排序:簡單的桶排序,適用于正整數(shù)且上界不大的數(shù)組排序。此處的映射直接是線性的。代碼實現(xiàn)如下:

void BucketSort(int array[], int len) {
    int bucket[MAX];
    memset(bucket, 0, sizeof(bucket));

    for (int i = 0; i < len; i++) {
        bucket[array[i]]++;
    }

    int k = 0;
    for (int j = 0; j < MAX; j++) {
        while (bucket[j]--) {
            array[k++] = j;
        }
    }
}

快速排序:快速排序是找出一個元素(理論上可以隨便找一個,一般都會選擇第一個)作為基準(zhǔn)(pivot),然后對數(shù)組進(jìn)行分區(qū)操作,使基準(zhǔn)左邊的值都不大于基準(zhǔn)值,其基準(zhǔn)右邊的元素值都不小于基準(zhǔn)值,如此作為基準(zhǔn)的元素調(diào)整到排序后的正確位置,遞歸快速排序,將其他n-1個元素也調(diào)整到排序后的正確位置。最后每個元素都是在排序后的正確位置,排序完成。所以快速排序算法的核心算法是分區(qū)操作,即如何調(diào)整基準(zhǔn)的位置以及調(diào)整返回基準(zhǔn)的最終位置以便分治遞歸。例如:
2 4 9 3 6 7 1 5 首先用 2 當(dāng)作基準(zhǔn), 使用 i j 兩個指針分別從兩邊進(jìn)行掃描, 把比 2 小的元素和比 2 大的元素分開。 首先比較 2 和 5, 5 比 2 大, j 左移
2 4 9 3 6 7 1 5 比較 2 和 1, 1 小于 2, 所以把 1 放在 2 的位置
1 4 9 3 6 7 1 5 比較 2 和 4, 4 大于 2, 因此將 4 移動到后面
1 4 9 3 6 7 4 5 比較 2 和 7, 2 和 6, 2 和 3, 2 和 9, 全部大于 2, 滿足件,因此不變
經(jīng)過第一輪的快速排序, 元素變?yōu)橄旅娴臉幼?br> [1] 2 [9 3 6 7 4 5]
代碼實現(xiàn)如下:

void QuickSort(int array[], int left, int right) {
    if (left < right) {
        int key = array[left];
        int low = left;
        int high = right;
        while (low < high) {
            while (low < high && array[high] >= key) {
                high--;
            }
            array[low] = array[high];
            while (low < high && array[low] <= key) {
                low++;
            }
            array[high] = array[low];
        }

        array[low] = key;
        QuickSort(array, left, low - 1);
        QuickSort(array, low + 1, right);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容