堆排序步骤:
(1)变为大顶堆;根节点的值大于等于其孩子节点的值。堆是一个完全二叉树,很适合用顺序结构来实现,这里我们选择数组。
(2)最后一个数据和最顶部节点数据交换(最大值放在最后),然后再进行一次调整(heapify函数),变为大顶堆(此时heapsize减1)。
#include <iostream>
#include <vector>
using namespace std;
//交换两个数
void swap(vector<int> &arr,int i,int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//再次调整为大顶堆
void heapify(vector<int> &arr,int index,int heapsize)
{
int left = index*2 + 1;
while(left<heapsize)
{
int largest = left+1<heapsize && arr[left+1] > arr[left] ? left+1 : left;
largest = arr[largest] > arr[index] ? largest : index;
if (index == largest)
break;
swap(arr,index,largest);
index = largest;
left = index*2 + 1;
}
}
//变为大顶堆
void heapinsert(vector<int> &arr,int index)
{
while(arr[index] > arr[(index-1)/2])
{
swap(arr,index,(index-1)/2);
index = (index-1)/2;
}
}
//排序
void heapsort(vector<int> &arr)
{
if (arr.size()<2)
return;
for (int i=0;i<arr.size();i++)
heapinsert(arr,i);
int heapsize = arr.size();
swap(arr,0,--heapsize);
while(heapsize>0)
{
heapify(arr,0,heapsize);
swap(arr,0,--heapsize);
}
}
int main()
{
vector<int> arr;
int n,temp;
cin>>n;
for (int i=0;i<n;i++)
{
cin>>temp;
arr.push_back(temp);
}
heapsort(arr);
for(int i=0;i<arr.size();i++)
cout<<arr[i]<<endl;
system("pause");
return 0;
}