堆排,时间复杂度O(nlogn),空间复杂度O(1)。
#include<iostream>
#include<algorithm>
using namespace std;
void sift(int nums[],int low,int high){
int i=low,j=2*i;
while (j<=high)
{
if(j<high&&nums[j]<nums[j+1])
j++;
if(nums[i]<nums[j]){
swap(nums[i],nums[j]);
i=j;
j=2*i;
}
else
{
break;
}
}
}
void heapSort(int array[],int n){
int i;
for(i=n/2+1;i>=0;i--){
sift(array,i,n);
}
for(i=1;i<n;i++){//循环n-1次
swap(array[0],array[n-i]);
sift(array,0,n-i-1);
}
}
int main()
{
int array[]={2,1,78,67,56,5,6,2,3};
size_t n=sizeof(array)/sizeof(int);
heapSort(array,n);
for(int i=0;i<n-1;i++)
cout<<array[i]<<" ";
cout<<array[n-1]<<endl;
return 0;
}