堆排序我也不準備細寫,主要的原因是感覺我寫的可能沒有別的博客那麼清晰,我沒有必要重複造輪子,所以下面就放我看了之後覺得講解的非常清晰的一篇博文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;
}