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 }

posted on 2012-09-02 23:47  robin.he  阅读(182)  评论(0)    收藏  举报

导航