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