package sort.choose;
import java.util.Arrays;
/**
* @author chenyi
* @Description 二叉樹遍歷
* @date 2022/2/17 15:30
*/
public class HeapSort {
public static void main(String[] args) {
//int arr[] = {4,6,8,5,9};
int arr[] = {10, 6, 14, 4, 8, 12, 16, -1, 1, 99};
System.out.println("遍歷順序存儲二叉樹");
System.out.println(Arrays.toString(arr));
/*System.out.println("第一次堆排序");
adjustHeap(arr,arr.length/2-1,arr.length);
System.out.println(Arrays.toString(arr));
System.out.println("第二次堆排序");
adjustHeap(arr,1,arr.length);
System.out.println(Arrays.toString(arr));
System.out.println("第三次堆排序");
adjustHeap(arr,0,arr.length);
System.out.println(Arrays.toString(arr));*/
System.out.println("堆排序");
for (int i = (arr.length >> 1) - 1; i >= 0; i--) {
adjustHeap(arr, i, arr.length);
}
for (int i = arr.length - 1; i > 0; i--) {
// 把最大的數放到末尾
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
adjustHeap(arr, 0, i);
}
System.out.println(Arrays.toString(arr));
}
private static void adjustHeap(int[] arr, int i, int length) {
// 記錄i的值
int temp = arr[i];
int max = i;
// 至少要有一個左節(jié)點吧
while (max * 2 < length - 1) {
// 比較樹的左右節(jié)點
if (arr[2 * i + 1] > arr[max]) {
max = 2 * i + 1;
}
if (2 * i + 2 < length && arr[2 * i + 2] > arr[max]) {
max = 2 * i + 2;
}
if (max == i) {
break;
}
// 交換之后要考慮是否會影響子樹,所以要對變更的節(jié)點進行再次調整
arr[i] = arr[max];
arr[max] = temp;
i = max;
}
}
}
堆排序
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
相關閱讀更多精彩內容
- https://blog.csdn.net/qq_25800311/article/details/8976254...
- 堆基本概念 堆排序是一個很重要的排序算法,它是高效率的排序算法,復雜度是O(nlogn),堆排序不僅是面試進場考的...
- 堆排序就是把最大堆堆頂的最大數取出,將剩余的堆繼續(xù)調整為最大堆,再次將堆頂的最大數取出(最大堆調整的遞歸運算),這...
- 基礎堆排序和 Heapify 這一節(jié)我們介紹兩個使用堆或者說基于堆的思想進行排序的算法。 思路1:一個一個地往最大...