java堆排序
阿新 • • 發佈:2019-02-08
先讓我們看以下序列:
然我們把這個先序列堆儲存:
然後在進行一次排序,排序的規則是,從最底層開始,左右子樹調出最大的值給父節
點,一直到0號位置。
最低層排序後,如上
然後全部排序後:
這就是一次排序,最大值到了0號,位置,然後0號和最後一個交換位置,確定9號位
置的值,
再進行剩下幾次排序,確定整個序列。
程式碼如下:
public static void adjust(int array[],int start,int end){ int tmp = array[start]; for(int i = 2*start+1;i<=end;i=2*i+1){ //找到左右孩子的最大值交換 i是最大值的下標 if(i < end && array[i] < array[i+1]){//保證有右孩子 i++; } if(array[i]>tmp){ array[start] = array[i]; start = i; } if(array[i]<tmp){ break; } array[start] = tmp; } } public static void heapsort(int array[]){ for(int i = (array.length-1-1)/2;i>=0;i--){ adjust(array,i,array.length-1); } int tmp = 0; for(int j = 0;j<array.length-1;j++){ tmp = array[0]; array[0] = array[array.length-j-1]; array[array.length-j-1] = tmp; //調整最大的數,其他子樹已經是大根堆 adjust(array,0,array.length-1-1-j); } }
如有錯誤,請多多指教。