堆排序Java實現
阿新 • • 發佈:2018-04-17
穩定 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實現