HeapSort

堆排序算法详解

1. HeapSort :    选择排序、不稳定排序

2. Time Complexity :  O(nlongn)

3. Step:

  1. 最大堆调整

  2. 创建最大堆

  3. 堆排序

 

4. Code:

 1 void HeapAdjust(int src[], int i, int len)
 2 {
 3     int l = 2 * i + 1;    //左孩子
 4     int r = 2 * i + 2;    //右孩子
 5     int largest = 0;
 6 
 7     if (l < len && src[l] > src[i])
 8       largest = l;
 9     else
10       largest = i;
11 
12     if (r < len && src[r] > src[largest])
13       largest = r;
14 
15     if (largest != i) {
16       int tmp;
17 
18       tmp = src[i];
19       src[i] = src[largest];
20       src[largest] = tmp;
21 
22       HeapAdjust(src, largest, len); //swap可能破坏原来已是最大堆的子树,递归调整子树
23     }
24 }
25 
26 void HeapSort(int src[], int len)
27 {
28     int i;
29 
30     for (i = len / 2; i >= 0; --i)
31       HeapAdjust(src, i, len); //创建最大堆,len/2以后全为叶子节点,即已为最大堆,则调整len/2前的节点
32 
33     for (i = len - 1; i >=0; i--) {
34       int tmp;
35 
36       tmp = src[i];
37       src[i] = src[0];
38       src[0] = tmp;
39 
40       len--;
41       HeapAdjust(src, 0, len); //递归排序,每次递归找出最大数,有序数加一,len--
42     }
43 }

转载于:https://www.cnblogs.com/robin-he0221/archive/2012/09/02/HeapSort.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值