堆與堆排序

堆是具有下列性質的完全二叉樹
每個節點的值都大于或等于左右孩子節點的值,稱為大頂堆;
每個節點的值都小于或等于左右孩子節點的值,稱為小頂堆。

堆排序

堆排序的思想是首先構建一個大頂堆(從小到大排列),然后將根節點的值移除,該根節點值就是序列最大值,然后重建調整成一個大頂堆,再次將根節點移除,該根節點即為第二大值,循環往復,就能形成一個有序序列了。
代碼實現:

#include <iostream>

using namespace std;

void adustHeap(int* arr, int low, int high) {
    int big = arr[low];
    for(int i = 2*low + 1; i <= high; i = 2*i + 1){
        if((i < high) && (arr[i] < arr[i+1]))
            ++i;
        if(big > arr[i])
            break;
        arr[low] = arr[i];
        low = i;
    }
    arr[low] = big;
}

void heap_sort(int* arr, int length){
    if(arr == NULL || length <= 0) {
        return;
    }
    for(int i = length/2 - 1; i >= 0; --i){
        adustHeap(arr, i, length-1);
    }
    for(int j = length-1; j > 0; --j){
        swap(arr[0], arr[j]);
        adustHeap(arr, 0, j-1);
    }
}
int main() {
    int arr[10] = {8, 3, 9, 0, 2, 4, 6, 1, 7, 5};
    heap_sort(arr, 10);
    for(int i = 0; i < 10; ++i)
        cout << arr[i] << " ";
    cout << endl;
    return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容