堆排
先给出个慢不错的堆排博客:http://www.cnblogs.com/kkun/archive/2011/11/23/2260286.html
关于最大堆:最大堆中的堆并非指堆栈的堆,而是另一种数据结构。最大堆是一种特殊的完全二叉树,其还满足所有父亲节点不小于其左右儿子这个条件。显然堆顶元素为最大元素。
堆排可以分为三步:
1. 将待排序数组建立成最大堆
2. 取当前堆顶元素加入已就序数组
3. 维护2中除去堆顶元素的最大堆
代码:
1 #include <iostream> 2 using namespace std; 3 4 const int MAXN=1e6+10; 5 6 void heapadjust(int array[MAXN], int i, int length){//维护最大堆 7 int l; 8 for(; i*2+1<length; i=l){ 9 int l=i*2+1;//左儿子 10 if(l<length-1&&array[l+1]>array[l]){ 11 l++;//若右儿子大于左儿子,令右儿子为左儿子 12 } 13 if(array[i]<array[l]){ 14 array[i]=array[l]^array[i]; 15 array[l]=array[l]^array[i]; 16 array[i]=array[l]^array[i]; 17 }else break; 18 } 19 } 20 21 void heapsort(int array[MAXN], int length){ 22 for(int i=length/2-1; i>=0; i--){//初始时构建最大堆 23 heapadjust(array, i, length); 24 } 25 for(int i=length-1; i>0; i--){ 26 array[i]=array[0]^array[i];//将堆顶元素加入已就序数组 27 array[0]=array[0]^array[i]; 28 array[i]=array[0]^array[i]; 29 heapadjust(array, 0, i);//缩小范围并调整最大堆 30 } 31 } 32 33 int main(void){ 34 int n, a[MAXN]; 35 cin >> n; 36 for(int i=0; i<n; i++){ 37 cin >> a[i]; 38 } 39 heapsort(a, n); 40 for(int i=0; i<n; i++){ 41 cout << a[i] << " "; 42 } 43 cout << endl; 44 return 0; 45 }
我就是我,颜色不一样的烟火 --- geloutingyu