堆排序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 }