堆排序实现

堆排序的过程归纳为以下步骤:

  1、监理初始堆积;

  2、交换堆积的第一个元素(如果是大顶堆就是最大值元素)与堆积的最后一个元素;

  3、将移走最大值元素之后的剩余元素组成的序列再转为一个堆积;

  4、重复上述过程中的2和3步 (n-1)次;

如何将原始序列调整为一个初始堆积:

  若原始序列所对应的完全二叉树(该完全二叉树不一定是个堆积)的深度是d,则从第d-1层最右边的那个分支节点(序号为【n/2】)开始,将该节点视为根节点(序号为i),调用调整函数,每调用一次,执行一次i-1送i的操作,知道i=0,在调用一次,完成构建初始堆积。

 

java简单实现:

 

 1 package interview.tree.interview;
 2 
 3 /**
 4  * Created by BUAA514 on 2018-08-07.
 5  */
 6 public class HeapSort {
 7 
 8 
 9     public static void main(String []args) {
10         int[] arr = { 50, 10, 90, 30, 70, 40, 80, 60, 20 };
11         System.out.println("排序之前:");
12         for (int i = 0; i < arr.length; i++) {
13             System.out.print(arr[i] + " ");
14         }
15 
16         // 堆排序
17         heapSort(arr);
18         System.out.println();
19         System.out.println("排序之后:");
20         for (int i = 0; i < arr.length; i++) {
21             System.out.print(arr[i] + " ");
22         }
23     }
24 
25 
26     /**
27      * heap sort implementation
28      * @param arr
29      */
30     public static void heapSort(int[] arr) {
31         // init heap
32         int i = 0;
33         for (i = arr.length/2;i >= 0;i--) {
34             adjust(arr,i,arr.length);
35         }
36 
37         int temp = 0;
38         for (i = arr.length-1;i>0;i--) {
39             // swap
40             temp = arr[i];
41             arr[i] = arr[0];
42             arr[0] = temp;
43             adjust(arr,0,i);
44         }
45     }
46 
47 
48 
49     /**
50      * 调整为堆积
51      * @param arr   数组
52      * @param i     根节点的序号(index,start from 0)
53      * @param n     数组的长度
54      */
55     public static void adjust(int arr[],int i,int n) {
56         int j;
57         int temp = arr[i];
58         j = 2 * i + 1;
59         while(j < n) {
60             if (j < n-1 && arr[j] < arr[j+1]){
61                 j++;
62             }
63 
64             if (temp >= arr[j]){
65                 break;
66             }
67             arr[(j-1)/2] = arr[j];
68             j = 2 * j + 1;
69         }
70         arr[(j-1)/2] = temp;
71     }
72 }

 

posted @ 2018-08-07 17:35  一介草民李八千  阅读(132)  评论(0)    收藏  举报