堆排序

来源:互联网 发布:手机写作辅助软件 编辑:程序博客网 时间:2024/06/06 11:01
#include<iostream>using namespace std;int left(int i){return 2*i;}//左孩子int right(int i){return 2*i+1;}右孩子void print_array(int *a,size_t length){for(size_t i = 1;i < length;i++){cout<<a[i]<<" ";}}//输出数组void heap_modify(int *a,int i,int heapsize){while(i<=heapsize){int l =left(i);int r = right(i);int largest=i,temp;if(l<=heapsize&&a[i]<a[l])largest =l ;if(r<=heapsize&&a[largest]<a[r])largest =r ;//得到左右孩子中的最大值if(i==largest)break;temp=a[largest];a[largest] = a[i];a[i]  = temp;//交换i = largest;//下一个节点//print_array(a,11);//cout<<endl;//cout<<largest <<" ";}}void built_heap(int *a,int length){for(size_t i = length/2;i>0;i--){heap_modify(a,i,length);}}//建堆void heap_sort(int *a,int length){built_heap(a,length);int heapsize = length-1;for(size_t i = length-1;i>=2;i--){int temp;temp = a[1];a[1] = a[i];a[i] = temp;heapsize--;heap_modify(a,1,heapsize);//最大值拿掉,重新建堆}}int main(){int a[11] = {0,10,9,8,7,6,5,4,3,2,1};//数组下标0位不使用,从1位开始cout<<"before heapsort"<<endl;print_array(a,11);cout<<endl;heap_sort(a,11);;cout<<"after heapsort"<<endl;print_array(a,11);}
//解释如注释
0 0
原创粉丝点击