堆排序,cpp实现

来源:互联网 发布:算法设计 pdf 编辑:程序博客网 时间:2024/05/17 09:12
#include <iostream>


using namespace std;


void swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}


/*初始建堆,实为对孩子所在列的插入排序*/
void buildHeap(int a[],int length){
for(int i=1;i<length;++i){
int parent = i;
for(int j=(parent-1)/2;j>=0&&parent!=0;parent=j,j=(parent-1)/2){
if(a[j]<a[parent]){
swap(a[j],a[parent]);
}
}
}
}


/*在每次删除顶部元素后恢复堆,本质上从顶部开始,和左右孩子较大的孩子交换,一直到不能交换为止,时间效率为log2n*/
void recoverHeap(int a[],int size){
int parent = 0;
for(int l=1,r=2;parent<size/2;l=2*parent+1,r=2*parent+2){
int max;
if(r<size&&a[l]<a[r]){
max = r;
}else{
max = l;
}
if(a[max] > a[parent]){
swap(a[max],a[parent]);
parent = max;
}else{
return ;
}
}
}


/*堆排序*/
void sortHeap(int a[],int length){
buildHeap(a,length);
for(int i = length-1;i>0;--i){
/*逻辑上删除顶部元素*/
swap(a[i],a[0]);
/*恢复堆*/
recoverHeap(a,i);
/*查看每次排序后的结果*/
for(int i=0;i<10;++i){
cout << a[i] << " ";
}
cout << endl;
}
}


int main(int argc, char const *argv[])
{
int a[10] = {3,1,2,8,7,5,9,4,6,0};
sortHeap(a,10);
return 0;
}