public class heapsort
public static heapsort getinstance()}}
return sinstance;
}/**
* 堆排序演算法入口
* @param arr 建議使用個位數陣列測試方便直觀觀察排序過程
* 0
* 3 4
*2 5 6 1
* @return 排序後陣列
*/public int heapsort(int arr)
//然後交換
for (int j = length - 1;j>=0;j--)
printheap(arr);
return arr;
}/**
* 交換陣列任意兩個索引的值
* @param arr
* @param i
* @param j
*/public void swap(int arr, int i, int j)
public void adjustheap(int arr,int i,int length)
//如果 父節點小於子節點 交換 同時父節點變成了原來較大
// 的子節點,繼續向下比較,將較小的值沉下去
swap(arr,i,k);
i = k;
printheap(arr);}}
/*public void adjustheap(int arr,int i,int length)else
}arr[i] = temp;//將temp值放到最終的位置
printheap(arr);
}*//**
** @param length
* @return 任意陣列以堆的形式展開後的層級數
*/public static int count(int length)
//除法
/*int i = 1;
while (n >= 2)
return i;*/
//乘法
int i = 1;
int count = i;
while (count < length)
return i;
}/**
* 將陣列以堆的形式列印出來,方便學習
* @param arr
*/public void printheap(int arr)
//列印時層級為i首個元素的偏移
int offset = max >> (i+1);
//層級為i時元素之間的間隔
int interval = max >> i;
//對於非葉子層級(不是最後一層),首層元素索引k,每層個數等於k+1,而對最後一層,個數為length-k;
int count = (k < level-1) ? k+1 : (length - k);
for(int j = k;j < (k+count);j++)
system.out.println(sb.tostring());}}
}
選擇排序(三) 堆排序
這樣,還剩下兩個問題 1.如何將乙個交換後的無序區調整為大根堆 2.如何在排序之前建立那個初始的大根堆。而第二個問題是可以通過第乙個問題的解決而解決的。1.如何將乙個交換後的無序區調整為大根堆?由於進行元素交換前,無序區是乙個大根堆,即左子樹和右子樹都是大根堆,所以根節點變化後左右子樹仍然都是大根堆...
排序演算法 三 堆排序
1.heap.class package cn.sort.heap 堆排序實現 公升序排序 author ly public class heap system.out.println 向下調整 先拿左右子樹進行比較,看誰比較大,然後再拿大的與父結點進行比較,若孩子結點比較大,則大孩子與父結點交換,...
選擇排序(三) 堆排序
這樣,還剩下兩個問題 1.如何將乙個交換後的無序區調整為大根堆 2.如何在排序之前建立那個初始的大根堆。而第二個問題是可以通過第乙個問題的解決而解決的。1.如何將乙個交換後的無序區調整為大根堆?由於進行元素交換前,無序區是乙個大根堆,即左子樹和右子樹都是大根堆,所以根節點變化後左右子樹仍然都是大根堆...