堆排序代码实现
package com.atguigu.tree;import java.util.Arrays;/*** @創(chuàng)建人 wdl* @創(chuàng)建時(shí)間 2021/3/26* @描述*/
public class HeapSort {public static void main(String[] args) {//要求將數(shù)組進(jìn)行升序排序int arr[]={4,6,8,5,9};heapSort(arr);}//編寫一個(gè)堆排序的方法public static void heapSort(int arr[]){int temp=0;System.out.println("堆排序");
// //分步完成
// adjustHeap(arr,1,arr.length);
// System.out.println("第一次"+ Arrays.toString(arr));//4,9,8,5,6
// adjustHeap(arr,0,arr.length);
// System.out.println("第二次"+Arrays.toString(arr));//9,6,8,5,4//完成我們最終代碼//將無序序列構(gòu)建成一個(gè)堆,根據(jù)升序需求求選擇大頂堆或小頂堆for (int i=arr.length/2-1;i>=0;i--){adjustHeap(arr,i,arr.length);}for(int j=arr.length-1;j>0;j--){//交換temp=arr[j];arr[j]=arr[0];arr[0]=temp;adjustHeap(arr,0,j);}System.out.println(Arrays.toString(arr));//9,6,8,5,4}/***功能:完成將以i對應(yīng)的非葉子節(jié)點(diǎn)的樹調(diào)整成大頂堆* 舉例int arr[]={4,6,8,5,9};=>i=1=>adjustHeap=>得到4,9,8,5,6* 如果我們再次調(diào)用adjustHeap傳入的是i=0=>得到9,6,8,5,4** @param arr 待調(diào)整的數(shù)組* @param i 表示非葉子節(jié)點(diǎn)在數(shù)組中索引* @param length 表示對多少個(gè)元素繼續(xù)進(jìn)行調(diào)整,length是在逐漸的減少*///將一個(gè)數(shù)組(二叉樹),調(diào)整成一個(gè)大頂堆public static void adjustHeap(int arr[],int i,int length){int temp=arr[i];//先取出當(dāng)前元素的值,保存在臨時(shí)變量//開始調(diào)整//1.k=i*2+1 k是i節(jié)點(diǎn)的左子節(jié)點(diǎn)for(int k=i*2+1;k<length;k=k*2+1){if(k+1<length&&arr[k]<arr[k+1]){//說明左子節(jié)點(diǎn)的值小于右子節(jié)點(diǎn)的值k++;//k就指向右子節(jié)點(diǎn)}if(arr[k]>temp){//如果子節(jié)點(diǎn)大于父節(jié)點(diǎn)arr[i]=arr[k];//把較大的值賦給當(dāng)前節(jié)點(diǎn)i=k;//!!!i指向k,繼續(xù)循環(huán)比較}else{break;//!}}//當(dāng)for循環(huán)結(jié)束后,我們已經(jīng)將以i為父節(jié)點(diǎn)的樹的最大值,放在了最頂(局部)arr[i]=temp;//將temp值放到調(diào)整后的位置}}
總結(jié)
- 上一篇: 遍历线索化二叉树+图解
- 下一篇: 赫夫曼树+图解