c 實現堆排序 建立堆

堆排序過程:

1.通過數組建立一個堆,升序排序建立大根堆,降序排序建立小根堆;

2.每次調整完一次,將最大的跟=根節點的值換到數組最後一個位置,然後重新調整【0~n-1】爲一個新的大根堆,以此排序。

代碼:

#include<iostream>
#include<stdio.h>
#include<queue>

#include <vector>
using namespace std;
/////////////////////////////////////////堆排///////////////////////////////

void adjust(int *ary, int node, int m) { 
    int left = node * 2 + 1;
    int right = node * 2 + 2;
    int parent = node;
    if (left<m && ary[left]>ary[node]) {
        parent = left;
    }
    if (right < m&&ary[right] > ary[node]&&ary[left]<ary[right]) {//必須判斷右邊是否大於左邊,否則parent有可能被改變
        parent = right;
    }
    if (parent != node) {
        swap(ary[parent],ary[node]); //
        adjust(ary, parent, m);  //遞歸處理
    }

}

void heapsort(int *vec, int n) {
   
    for (int i = n / 2 - 1; i >= 0; --i)
    {
        adjust(vec, i, n);
    }
   
    for (int i = n - 1; i >= 0;i--)
    {
        swap(vec[0], vec[i]);           // 將當前最大的放置到數組末尾
        adjust(vec, 0, i);            // 將未完成排序的部分繼續進行堆排序
    }
}
int main() {
    int ar[] = { 1,1,4,3,9,-3 };
   
    heapsort(ar, 6);
    for (int i = 0; i < 6; i++) {
        cout << ar[i] << " ";
    }
    cout << endl;   
}

結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章