堆排序過程:
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;
}
結果: