算法思想参考博文:https://www.cnblogs.com/chengxiao/p/6129630.html
废话不多说,直接上代码。
// 堆排序.cpp
//
#include <iostream>
void swap(int &m, int &n){
int temp = m;
m = n;
n = temp;
}
void adjust(int *t, int size, int pos){
int k = pos;
int bigger_pos;//值更大的子节点的下标
while (k < size / 2)//只要节点k有子节点,就继续向下调整
{
if (2 * k + 2 < size)
bigger_pos = t[2 * k + 1] > t[2 * k + 2] ? 2 * k + 1 : 2 * k + 2;
else
bigger_pos = 2 * k + 1;
if (t[k] < t[bigger_pos])
{
swap(t[k], t[bigger_pos]);
k = bigger_pos;
}
else
break;//只要根节点不需要调整,就退出循环,因为下面的子节点已经符合堆的规律了
}
}
void heap_sort(int *t, int size){
//建立大根堆
for (int i = size / 2 - 1; i >= 0; --i){
adjust(t, size, i);
}
//交换堆头堆尾并更新堆
for (int i = size - 1; i > 0; --i)
{
swap(t[0], t[i]);
adjust(t, i, 0);
}
}
int main(int argc)
{
int size = 10;
int *array = new int[size];
for (int i = 0; i < size; i++){
array[i] = rand() % 100;
printf("%d\t", array[i]);
}
printf("\n");
heap_sort(array, size);
for (int i = 0; i < size; i++){
printf("%d\t", array[i]);
}
delete array;
return 0;
}