您的位置:首页 > 其它

堆排序

2016-01-22 15:06 211 查看
是一棵顺序存储完全二叉树

其中每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆
其中每个结点的关键字都不小于其孩子结点的关键字,这样的堆称为大根堆

举例来说,对于n个元素的序列{R0, R1, ... , Rn}当且仅当满足下列关系之一时,称之为堆:
(1) Ri <= R2i+1 且 Ri <= R2i+2 (小根堆)
(2) Ri >= R2i+1 且 Ri >= R2i+2 (大根堆)

其中i=1,2,…,n/2向下取整;

1 public class HeapSort {
2
3 public void HeapAdjust(int[] array, int parent, int length) {
4 int temp = array[parent]; // temp保存当前父节点
5 int child = 2 * parent + 1; // 先获得左孩子
6
7 while (child < length) {
8 // 如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点
9 if (child + 1 < length && array[child] < array[child + 1]) {
10 child++;
11 }
12
13 // 如果父结点的值已经大于孩子结点的值,则直接结束
14 if (temp >= array[child])
15 break;
16
17 // 把孩子结点的值赋给父结点
18 array[parent] = array[child];
19
20 // 选取孩子结点的左孩子结点,继续向下筛选
21 parent = child;
22 child = 2 * child + 1;
23 }
24
25 array[parent] = temp;
26 }
27
28 public void heapSort(int[] list) {
29 // 循环建立初始堆
30 for (int i = list.length / 2; i >= 0; i--) {
31 HeapAdjust(list, i, list.length - 1);
32 }
33
34 // 进行n-1次循环,完成排序
35 for (int i = list.length - 1; i > 0; i--) {
36 // 最后一个元素和第一元素进行交换
37 int temp = list[i];
38 list[i] = list[0];
39 list[0] = temp;
40
41 // 筛选 R[0] 结点,得到i-1个结点的堆
42 HeapAdjust(list, 0, i);
43 System.out.format("第 %d 趟: \t", list.length - i);
44 printPart(list, 0, list.length - 1);
45 }
46 }
47
48 // 打印序列
49 public void printPart(int[] list, int begin, int end) {
50 for (int i = 0; i < begin; i++) {
51 System.out.print("\t");
52 }
53 for (int i = begin; i <= end; i++) {
54 System.out.print(list[i] + "\t");
55 }
56 System.out.println();
57 }
58
59 public static void main(String[] args) {
60 // 初始化一个序列
61 int[] array = { 1, 3, 4, 5, 2, 6, 9, 7, 8, 0 };
62
63 // 调用快速排序方法
64 HeapSort heap = new HeapSort();
65 System.out.print("排序前:\t");
66 heap.printPart(array, 0, array.length - 1);
67 heap.heapSort(array);
68 System.out.print("排序后:\t");
69 heap.printPart(array, 0, array.length - 1);
70 }
71
72 }

堆排序之JAVA代码实现

排序前: 1 3 4 5 2 6 9 7 8 0
第 1 趟: 8 7 6 5 2 1 4 3 0 9
第 2 趟: 7 5 6 3 2 1 4 0 8 9
第 3 趟: 6 5 4 3 2 1 0 7 8 9
第 4 趟: 5 3 4 0 2 1 6 7 8 9
第 5 趟: 4 3 1 0 2 5 6 7 8 9
第 6 趟: 3 2 1 0 4 5 6 7 8 9
第 7 趟: 2 0 1 3 4 5 6 7 8 9
第 8 趟: 1 0 2 3 4 5 6 7 8 9
第 9 趟: 0 1 2 3 4 5 6 7 8 9
排序后: 0 1 2 3 4 5 6 7 8 9

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: