java實現堆排序

2021-08-31 01:17:05 字數 2456 閱讀 6209

需要用到兩個子函式,函式1是實現將乙個陣列變為乙個大根堆,函式2是為了將乙個打亂了的陣列重新調整為大根堆。

每次對於大根堆中,第乙個位置就是整個陣列的最大值,所以我們可以將大根堆的第乙個位置值取出來,和最後乙個值進行交換,然後就找出了最大值,接下來,我們就在第1~len-1個數中繼續進行相同的操作。

上邊兩個函式都用到了乙個自定義的交換陣列中數值的函式swap。

public static void swap(int arr, int i, int j)
// 插入結點,按照大根堆結構插入

public static void heapinsert(int arr, int index)

}

// 下邊來乙個堆調整的函式,heaplen就是堆的長度

public static void heapify(int index, int heaplen, int arr) else

// 然後是結點同時向下邊移動

index = maxindex;// 只是針對修改的一部分進行繼續向下

left = index * 2 + 1;

} }

package testsort;

public class heapsort ;

system.out.println("原始陣列: ");

for (int i = 0; i < arr.length; i++)

system.out.println();

system.out.println("排序後的陣列: ");

heapsort(arr);

for (int i = 0; i < arr.length; i++)

} public static void heapsort(int arr)

// 通過上邊形成了大根堆,然後就是調整,把第乙個和最後乙個交換,就把最大值放入到了我們陣列的最後乙個位置。

while (len > 0)

} // 插入結點,按照大根堆結構插入

public static void heapinsert(int arr, int index)

} // 下邊來乙個堆調整的函式,heaplen就是堆的長度

public static void heapify(int index, int heaplen, int arr) else

// 如果當前值大於maxindex位置值,就交換

if (arr[index] < arr[maxindex]) else

// 然後是結點同時向下邊移動

index = maxindex;// 只是針對修改的一部分進行繼續向下

left = index * 2 + 1;// 每次調轉到左結點位置

} }public static void swap(int arr, int i, int j)

}

控制台列印:

下邊也是和上邊差不多的堆排序,只是有細微差別,是後期自己重新寫了一遍,新增了部分注釋:

package sort;

public class heapsort ;

heapsort(arr, 0, arr.length - 1);

for (int i = 0; i < arr.length; i++)

} public static void heapsort(int arr, int start, int end)

// 然後把大根堆的堆頂放到大根堆最後乙個位置,同時堆的長度減一

int heaplen = arr.length;// 堆的初始長度

while (heaplen > 0)

} // 加入乙個數到陣列最後乙個位置(原來的陣列已經是大根堆),處理之後,還是大根堆

public static void heapinsert(int arr, int index)

} // 下邊是如果有乙個資料變化了,也就是堆頂資料變化了,怎麼調節這個陣列,成為乙個大根堆

public static void heapify(int arr, int heaplen) else

if (arr[index] < arr[maxchild])

// else

// 然後移動,當前結點和子結點都往下移動

index = maxchild;

} }private static void swap(int arr, int index1, int index2)

}

控制台:

java實現堆排序

許多應用要用堆,比如,優先佇列,即佇列的擴充,佇列的每個元素增加乙個稱為優先順序的字段,優先佇列可以是線性結構的,但要有較高的效率,應把它組織成堆結構。元素入隊是,相當於執行堆的插入演算法 但在隊頭每次刪除的總是隊頂具有最大優先順序的元素,因此可以把它稱為最大優先順序佇列。再比如,堆排序是選擇排序中...

堆排序java實現

公升序用大根堆,降序用小根堆 調整堆 從根節點開始向下調整堆 先建立初始堆,從n 2 1 第乙個非葉子節點 節點開始,將之看做根節點,向下調整堆,到根節點結束 迴圈i from n 1 to 0,每次取出堆的最頂層根節點,即陣列下標為0,然後與節點i交換,這樣對於大根堆而言,最大值總是在後面,再從根...

Java 實現堆排序

堆排序主要是利用堆在根節點上的特性,既在大頂堆的情況下,堆的第乙個元素是堆當中最大的元素,而在小頂堆的情況下,堆的第乙個元素是最小的節點。所以在堆排序的過程,主要的操作就是對每次取出堆頂的元素之後 在這裡使用大頂堆 我們就選出了堆中的最大元素,然後對堆剩下的元素進行再次進行大頂堆的調正,得到乙個新的...