1. 程式人生 > >堆排序Java實現

堆排序Java實現

穩定 bsp urn 復雜 java實現 重新整理 建堆 很多 空間

看了很多博主寫了堆排序的原理,都講解的挺明白,就是代碼實現(主要是java語言)有些讓人眼花繚亂。我重新整理了堆排序的代碼實現(java)。

有哪些問題和不妥之處,還希望夥伴們提醒,我及時改正。感謝!!

堆排序講解:https://blog.csdn.net/qq_21492635/article/details/73105580

      https://blog.csdn.net/u010429424/article/details/77582627

總結點:

(1)堆排序不穩定。

(2)得到遞增序列用大頂堆,得到遞減序列用小頂堆。

(3)排序時間復雜的O(nlog2n),輔助空間O(1)。

(4)初始建堆O(n)

 1 public class HeapTest {
 2 
 3     public static void main(String[] args) {
 4         int [] array = {1,19,3,24,26,4,78,14,27,10,177,6,22,17,22,53};
 5          heapSort(array);
 6          for (int i = 0; i < array.length; i++) {
 7             System.out.print(array[i]+ " ");
 8         }
 9
} 10 11 /** 12 * 堆排序 13 * @param array 14 */ 15 private static void heapSort(int[] array) { 16 // TODO Auto-generated method stub 17 //考慮邊界情況 18 if (array.length <= 1) { 19 return; 20 } 21 //構建初始堆 22 for (int i = (array.length / 2) - 1; i >= 0; i--){
23 adjustHeap(array,i,array.length - 1); 24 } 25 //將堆頂元素置換到待排序數組的最後一個,對新長度的數組進行堆調整 26 for (int k = array.length - 1; k >= 0; k--){ 27 int tmp = array[k]; 28 array[k] = array[0]; 29 array[0] = tmp; 30 //此處adjustHeap中k代表待排序的數組長度,不是數組下標 31 adjustHeap(array, 0, k - 1); 32 } 33 } 34 35 /** 36 * 構建堆 37 * start為待調整數組的開始元素的下表,end為待調整數組最後一個元素的下標 38 * @param array 39 * @param i 40 * @param length 41 */ 42 private static void adjustHeap(int[] array, int start, int end) { 43 // TODO Auto-generated method stub 44 45 int temp,j; 46 //temp存儲start處的值 47 temp = array[start]; 48 //用j記錄start左孩子的下標: j = 2 * start + 1 49 for (j = 2 * start + 1;j <= end; j = j * 2 + 1){ 50 //如果start有右孩子,且右孩子比左孩子大,j++,獲得右孩子下標 51 if (j + 1 <= end && array[j] < array[j + 1]) { 52 j++; 53 } 54 //判斷當temp在現在位置(當前的start位置),是不是比他的孩子都大,如果是,調整完畢跳出調整循環;如果不是,當前孩子的值賦給當前start位置 55 if (temp >= array[j]) { 56 break; 57 } 58 array[start] = array[j]; 59 //存temp值可以被賦值的節點的下標 60 start = j; 61 } 62 //將temp賦值到當前的start位置 63 array[start] = temp; 64 } 65 }

堆排序Java實現