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

 

posted @ 2018-04-17 09:54  刘旭是一头小水猪  阅读(158)  评论(0编辑  收藏  举报