堆排序是利用二叉樹的原理進行排序,所以又稱之為二叉樹排序。樹中任意一非葉節(jié)點的關(guān)鍵字均不大于或不小于其左右孩子節(jié)點的關(guān)鍵字。
堆排序原理:利用最大堆或是最小堆特點,先將數(shù)組生成一個最大堆或最小堆的二叉樹,再將關(guān)鍵字的堆頂與無序區(qū)的最后一個節(jié)點進行位置互換。多次循環(huán),保證其節(jié)點都比其孩子節(jié)點的數(shù)值大或者小。
代買實現(xiàn):
public class Test{
public static void main(String[] args){
int[] arr = {1,5,3,4,8,2,6,7};
for(int i = arr.length/2 - 1; i > 0; i--){ //對數(shù)組進行建堆操作,就是從最后一個非葉結(jié)點進行篩選的過程
paixu(arr,i,arr.length-1);
}
for(int i = arr.length-1; i > 0; i--){ //將該大頂堆 的堆頂與堆尾互換位置
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
paixu(arr,0,i-1);
}
for(int i:arr){ //遍歷輸出數(shù)組
Sysout.print(i+" ");
}
}
public static void paixu(int[] arr, int i, int len){
int temp = arr[i]; //i為最后的一個非葉子結(jié)點 即有子結(jié)點的結(jié)點
for(int j = 2*i; j < len; j *=2){
if(i < len && arr[j] < arr[j+1]){
++j; //值較大的數(shù)組小標
}
if(temp >= arr[j]){
breack;
}
arr[i] = arr[j]; //將此值 上移到父節(jié)點
i=j;
}
arr[i] = temp; //要放入的位置
}
}
浙公網(wǎng)安備 33010602011771號