讲讲堆排序的实现步骤:
1,生成堆
2,把堆顶元素放到最后一个
3,调整成为新的堆(这一点至关重要)
堆的二叉结构的实现方式:数组。。。
如果小伙伴还有有堆这种数据结构有不懂的,请参照下方的附录;
最重要的就是调整堆这个函数的书写,其他的都是一些简单的逻辑上面的问题
手撸的C++代码
#include <iostream>
#include <algorithm>
using namespace std;
void HeapAdjust(int *a,int i,int size){
int lchild = 2*i;
int rchild = 2*i+1;
int max = i;
if(i<=size/2){
if(lchild<=size && a[lchild]>a[max]){
max = lchild;
}
if(rchild<=size && a[rchild]>a[max]){
max = lchild;
}
if(max!=i){
swap(a[i],a[max]);
HeapAdjust(a,max,size);
}
}
}
void BuildHeap(int *a,int size){
int i;
for(i=size/2;i>=1;i--){
HeapAdjust(a,i,size);
}
}
void HeapSort(int *a,int size){
int i;
BuildHeap(a,size);
for(i=size;i>=1;i--){
swap(a[1],a[i]);
HeapAdjust(a,1,i-1);//对堆进行调整
}
}
int main(){
int a[100];
int size;
while(cin>>size &&size>0){
int i;
for(i=1;i<=size;i++){
cin>>a[i];
}
HeapSort(a,size);
for(i=1;i<=size;i++){
cout<<a[i]<<" ";
}
}
}
附录:一个绝对能看懂堆的调整过程的解释
http://blog.youkuaiyun.com/zz198808/article/details/7678055