堆排序的思想讲了很多了,我在这里不赘述,我这里直接上代码,外加上输入输出用例,适合笔试时通过。
#include<iostream>
#include<vector>
using namespace std;
//这个函数作用是构建大顶堆(arr是输入的数组,len是arr的长度,id是第一个非叶子节点的下标)
void adjust(vector<int>&arr,int len,int id)
{
int left=2*id+1; //id的左节点的下标
int right=2*id+2; //id的右子节点的下标
int max=id;
//保证max的永远是最大数的下标
if(left<len && arr[left]>arr[max])
{
max=left;
}
if(right<len && arr[right]>arr[max])
{
max=right;
}
if(max!=id)
{
swap(arr[max],arr[id]);
adjust(arr,len,max);
}
}
//堆排序
void heapSort(vector<int>&arr,int size)
{
//构建一个大顶推,自下而上,从最后一个非叶子节点开始
for(int i=size/2-1;i>=0;i--)
{
adjust(arr,size,i);
}
//调整编程大顶堆
for(int i=size-1;i>=1;i--)
{
swap(arr[i],arr[0]);//将第一个数(最大的数)和最后一个数交换
adjust(arr,i,0);//剩下的继续堆排序
}
}
//测试用例,控制台第一行输入数组长度,第二行输入数组,输出结果为排好序的数组
int main()
{
vector<int>arr;
int n;
//输入数组的个数
cin>>n;
for(int i=0;i<n;i++)
{
arr.push_back(i);
cin>>arr[i];
}
heapSort(arr,arr.size());
for (int i = 0; i < n; i++)
{
cout << arr[i]<<' ' ;
}
cout << endl;
return 0;
}