堆排序之Java实现

堆排序之Java实现

代码:

 1 package cn.com.zfc.lesson21.sort;
 2 
 3 /**
 4  * 
 5  * @title HeapSort
 6  * @describe 堆排序
 7  * @author 张富昌
 8  * @date 2016年10月2日下午5:33:50
 9  */
10 public class HeapSort {
11     public static void main(String[] args) {
12         // 声明整型数组
13         int[] array = new int[10];
14         // 使用循环和随机数初始化数组
15         for (int i = 0; i < array.length; i++) {
16             array[i] = (int) Math.round(Math.random() * 100);
17         }
18         System.out.println("原始数组为:");
19         for (int i : array) {
20             System.out.print(i + " ");
21         }
22         System.out.println();
23         System.out.println("排序后的数组为:");
24         for (int i : heapSort(array)) {
25             System.out.print(i + " ");
26         }
27     }
28 
29     /**
30      * 
31      * 功能:堆排序的基本思想是
32      * 
33      * 参数:int[] array
34      *
35      * 返回类型:int[]
36      */
37     public static int[] heapSort(int[] array) {
38         int[] arr = array;
39         for (int i = (arr.length - 2) / 2; i >= 0; i--) {
40             // 将 0~[n-1]调整成大顶堆
41             heapAdjust(arr, i, arr.length - 1);
42         }
43         for (int i = arr.length - 1; i > 0; i--) {
44             // 第 i 趟排序
45             swap(arr, 0, i);
46             heapAdjust(arr, 0, i - 1);
47         }
48 
49         return arr;
50     }
51 
52     /**
53      * 
54      * 功能:将待排数组调节成大顶堆,调整 arr[low],使除它以外的元素成为大顶堆
55      *
56      * 参数:int[] arr, int low, int high
57      *
58      * 返回类型:void
59      */
60     public static void heapAdjust(int[] arr, int low, int high) {
61         for (int f = low, i = 2 * low + 1; i <= high; i = 2 * i + 1) {
62             // f 为被调整的结点,i 为 f 的最大孩子
63             if (i < high && arr[i] < arr[i + 1]) {
64                 // 右孩子更大,则 i 指向右孩子
65                 i++;
66             }
67             if (arr[f] >= arr[i]) {
68                 // 已经成为大顶堆了
69                 break;
70             }
71             // 交换调整结点的位置
72             swap(arr, f, i);
73             // 让 i 成为新的调整结点
74             f = i;
75         }
76     }
77 
78     /**
79      * 
80      * 功能:交换两个数的值
81      *
82      * 参数:int i, int j
83      *
84      * 返回类型:void
85      */
86     public static void swap(int[] arr, int i, int j) {
87         int temp = arr[i];
88         arr[i] = arr[j];
89         arr[j] = temp;
90 
91     }
92 }

运行结果:

posted @ 2017-12-01 11:20  勇闯天涯zfc  阅读(188)  评论(0编辑  收藏  举报