1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| void siftdown(int* arr,int n,int i) { int t; while((i<<1)+1<n) { if(arr[i]>arr[(i<<1)+1]) t=((i<<1)+1); else t=i; if((i<<1)+2<n) if(arr[(i<<1)+2]<arr[t]) t=(i<<1)+2; if(t!=i) { std::swap(arr[i],arr[t]); i=t; } else break; } } void creat_heap(int* arr,int n) { for(int i=((n-1)>>1);i>=0;--i) siftdown(arr,n,i); } int select_min(int* arr,int n) { static int cnt=n; int t; t=arr[0]; arr[0]=arr[cnt-1]; --cnt; siftdown(arr,cnt,0); return t; } void heap_sort(int* arr,int n) { int* a=new int[n]; for(int i=0;i<n;++i) a[i]=arr[i]; creat_heap(a,n); for(int i=0;i<n;++i) arr[i]=select_min(a,n); delete []a; }
|