堆处理:
void shift(int data[], int i, int length) { for(int c; c= i* 2+ 1, c< length; ) if(c+= c+ 1< length && data[c]< data[c + 1], data[i]<= data[c]) swap(data[c], data[i]), i= c; else break; } void SortHeap(int data[], int m, int n) { for(int i=(n- 2)/ 2; i>= 0; i--) shift(data, i, n); //建堆 for(int i= n; i< m; i++) if(data[i]< data[0]) //加小值 data[0]= data[i], shift(data, 0, n); //再建堆 for(int n1= n-1, i= 0; i< n; i++) swap(data[0], data[n1- i]), shift(data, 0, n1- i); //堆转队列 }
提供数据、调用堆排序、正确性验证及计时的代码:
void ShowTime(String caption, Double &tms) { ShowMessage(String(caption+ " "+ (GetTickCount()- tms)/1000)+ "秒"); tms= GetTickCount(); } void control(int n) { int m= n< 9? n+ 2: n* pow(10, 3); //小数据调试 double tms= GetTickCount(); int *Data= new int[m], *DataSort= new int[m]; for(int i= 0; i< m; i++) //得随机数 DataSort[i]= Data[i]= random(m); ShowTime("制造随机数用时", tms); sort(DataSort, DataSort+ m); ShowTime("标准排序用时", tms); err: int k= n; SortHeap(Data, m, k); ShowTime("排序用时", tms); for(int k= n, i= 0; i<= k; i++) if(i== k) ShowMessage("取值正确"); else if(DataSort[i]!= Data[i]) { ShowMessage("取值出错"); goto err; } delete []DataSort; delete []Data; }
一亿取十万用时:2.19秒。真的够快。体现了算法的威力与魅力。
按题意,不排序也是可以的。那样,只在1.6秒。