堆排序我也不准备细写,主要的原因是感觉我写的可能没有别的博客那么清晰,我没有必要重复造轮子,所以下面就放我看了之后觉得讲解的非常清晰的一篇博文https://www.cnblogs.com/chengxiao/p/6129630.html
大体思路看完了,建堆和排序也会了,剩下的还有插入节点和删除节点操作,看这篇博客即可https://www.jianshu.com/p/21bef3fc3030
大小顶堆的算法大部分都是一样的,就是在判断大小那里判断条件相反,我给的代码是构建大顶堆,最后排序的结果是升序。
代码如下:
#include<iostream>
#include<vector>
using namespace std;
void swap(vector<int> &arr,int a,int b)
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
void adjustHeap(vector<int> &arr,int i,int size)
{
int temp = arr[i];
for (int k = 2 * i + 1; k < size; k = 2 * k + 1) //每次都是指向左节点
{
if (k + 1 < size && arr[k] < arr[k + 1]) //如果右节点比左节点大,则指向右节点
{
k++;
}
if (arr[k] > temp) //如果子节点比父节点大,则节点一直下滑
{
arr[i] = arr[k];
i = k;
}
else //否则停止下滑
{
break;
}
arr[i] = temp;
}
}
void sort(vector<int> &arr)
{
int size = arr.size();
for (int i = size / 2 - 1; i >= 0; i--)
{
adjustHeap(arr,i,size);
}
for (int i = size - 1; i >= 0; i--) //挨个取根节点元素按顺序放到数组的后面
{
swap(arr,0,i);
adjustHeap(arr,0,i);
}
}
int main()
{
vector<int> Input = {1,9,6,3,7,8,2,5,4,76,12,41,31,67,19,20,91,74};
sort(Input);
int size = Input.size();
for (int i = 0; i < size; i++)
{
cout << Input[i] << " ";
}
system("pause");
return 0;
}