堆排序

来源:互联网 发布:红蜘蛛网络多媒体教室 编辑:程序博客网 时间:2024/05/04 17:37

1、主要思想:

      对数组每一次建最大堆(分别对子树进行建最大堆)可以保证最大数据是第一个元素,每次获取最大数据后,将最大数据删除(与最后一个数据交换,整个数组长度减1),对新的数组重新建堆,依次执行到所有的数据均显示完成。

2、代码:

//堆排序#include <iostream>#include <vector>using namespace std;void max_heap(vector<float> &data, int n,int length);void build_max_heap(vector<float> &data);void heapsort(vector<float> &data);int main(){//接收排序数据vector<float> sort_data;float data;while ((cin>>data)&&(data!='a')){sort_data.push_back(data);}//显示需要排序的数据cout<<"The set of data show as:"<<endl;for (int i=0;i<sort_data.size();i++){cout<<sort_data[i]<<"\t";}cout<<endl;//对数据进行排序,从小到大cout<<"The set of data after sorting show as:"<<endl;heapsort(sort_data);system("pause");return 0;}//子树n建最大堆void max_heap(vector<float> &data, int n,int length){if( ((2*n+1)<=length)&&((2*n)<=length))//左分支和右分支均存在{//cout<<"1"<<endl;if(data[2*n-1]>=data[2*n])//左分支大{if (data[n-1]>=data[2*n-1])return ;else{float temp=data[n-1];data[n-1]=data[2*n-1];data[2*n-1]=temp;max_heap(data,2*n,length);}}else//右分支大{if (data[n-1]>=data[2*n])return ;else{float temp=data[n-1];data[n-1]=data[2*n];data[2*n]=temp;max_heap(data,2*n+1,length);}}}else if( ((2*n)<=length)&&((2*n+1)>length))//左分支存在{//cout<<"2"<<endl;if(data[n-1]>=data[2*n-1])return ;else{float temp=data[n-1];data[n-1]=data[2*n-1];data[2*n-1]=temp;max_heap(data,2*n,length);}}else if(((2*n)>length)&&((2*n+1)>length)){//cout<<"3"<<endl;return;}}//整个树建堆void build_max_heap(vector<float> &data){int num=data.size()/2;cout<<"num="<<num<<endl;for(int i=num;i>0;i--){max_heap(data,i,data.size());}}//堆排序void heapsort(vector<float> &data){int num=data.size();build_max_heap(data);for(int i=data.size();i>1;i--){cout<<data[0]<<"\t";//交换data[0]和data[i-1]float temp=data[0];data[0]=data[i-1];data[i-1]=temp;max_heap(data,1,--num);}cout<<data[0]<<endl;}

3、算法复杂度:

     build_max_heap()复杂度O(n)加上n-1次调用max_heap()的复杂度O(logn),即堆排序算法复杂度为O(nlogn)。