八大內部排序 -- 堆排序
阿新 • • 發佈:2019-01-10
堆排序(heap-sort):把關鍵字序列看成一顆二叉樹,樹上的非葉子節點的值均小於(或者大於)其左右子節點的值,所以樹根肯定是這個序列的最小值或者最大值。堆排序的核心是樹節點的調整,以維護一個最小堆樹(或者最大堆),建堆樹也是通過堆調整建立的。
時間複雜度為:O(nlong) ,不穩定的排序
程式碼如下:
#include <iostream> using namespace std; void print(int *a,int n){ for(int i=1;i<=n;i++){ cout<<a[i]<<" "; } cout<<endl; } void heap_ajust(int *a,int s,int len){ int key_value = a[s]; for(int j = 2*s;j<=len;j*=2){ if(j<len && a[j+1]>a[j]) j++; if(key_value > a[j]) break; a[s] = a[j]; s=j; } a[s] = key_value; } void heap_sort(int *a,int n){ // build heap for(int i=n/2;i>=1;i--){ heap_ajust(a,i,n); } // sort for(int i=n;i>0;i--){ swap(a[i],a[1]); heap_ajust(a,1,i-1); } } int main() { int *a; int n; cin>>n; a= new int[n+1]; for(int i=1;i<=n;i++){ cin>>a[i]; } heap_sort(a,n); print(a,n); return 0; }