堆排序

Posted doctors

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序相关的知识,希望对你有一定的参考价值。

源码实现:

  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5 void swap(int* pArry, int iNum, int x, int y)
  6 {
  7     int iTmp = 0;
  8 
  9     if (NULL == pArry || 0 > x || 0 > y || iNum <= x || iNum <= y)
 10     {
 11         cout << "swap err happen!!" << endl;
 12         return;
 13     }
 14 
 15     iTmp = pArry[x];
 16     pArry[x] = pArry[y];
 17     pArry[y] = iTmp;
 18     
 19     return;
 20 }
 21 
 22 
 23 int heapfiy(int* pArry, int iNum, int iRootIdx)
 24 {
 25     int maxIdx = iRootIdx;
 26     int lIdx = 2*iRootIdx + 1;
 27     int rIdx = 2*iRootIdx + 2;
 28 
 29     if (iNum > lIdx && pArry[lIdx] > pArry[maxIdx])
 30     {
 31         maxIdx = lIdx;
 32     }
 33     if (iNum > rIdx && pArry[rIdx] > pArry[maxIdx])
 34     {
 35         maxIdx = rIdx;
 36     }
 37     if (maxIdx != iRootIdx)
 38     {
 39         swap(pArry, iNum, iRootIdx, maxIdx);
 40         
 41         if (0 != heapfiy(pArry, iNum, maxIdx))
 42         {
 43             cout << "heapfiy, err!!!" << endl;
 44             return -1;
 45         }
 46     }
 47 
 48     return 0;
 49 }
 50 
 51 
 52 int heap_sort(int* pArry, int iNum)
 53 {
 54     int i = 0;
 55     int j = 0;
 56     int iTmp = 0;
 57 
 58     /*先构造一个最大堆
 59      * 整体上自底向上构造,堆最大值变化后内部从根到叶子进行递归更新
 60      */
 61     for (i = (iNum/2 - 1); i >= 0; i--)
 62     {
 63         if (0 != heapfiy(pArry,iNum,i))
 64         {
 65             cout << "err happen!!!" << endl;
 66             return -1;
 67         }
 68     }
 69 
 70     /*依次将最大值抽离到数组最后位置,再重新构造最大堆*/
 71     for (i = 1; i < iNum; i++)
 72     {
 73         swap(pArry, iNum, 0, iNum - i);        
 74         
 75         if (0 != heapfiy(pArry, iNum-i, 0))
 76         {
 77             cout << "err happen!!!" << endl;
 78             return -1;
 79         }
 80     }
 81 
 82     return 0;
 83 }
 84 
 85 int print_arry(int* pArry, int iNum)
 86 {
 87     int i = 0;
 88     if (NULL == pArry || 0 >= iNum)
 89     {
 90         return -1;
 91     }
 92     
 93     for (i =0; i < iNum; i++)
 94     {
 95         cout << pArry[i] << " ";
 96     }
 97 
 98     cout << endl;
 99 
100     return 0;
101 }
102 
103 int main()
104 {
105     int orginArry[] = {11,34,65,67,234,4,1,3,6,3,2,100,41,56,43};
106     int iNum = sizeof(orginArry)/sizeof(orginArry[0]);
107 
108     cout << "orgin arry: " << iNum << endl;
109     (void)print_arry(orginArry, iNum);
110 
111     if (0 != heap_sort(orginArry,iNum))
112     {
113         cout << "err happen!!!" << endl;
114         return -1;
115     }
116 
117     cout << "sort result:" << endl;
118     (void)print_arry(orginArry, iNum);
119 
120     return 0;
121 }

运行结果:

技术图片

 

算法理解:

1. 性能方面抽离最大值需要n数量级的循环,每次循环中heap的构建复杂度log(n),综合是nlog(n)的量级;

2. 算法的总体思想是,构建最大堆->找到最大值->剩下的进一步构建最大堆->再找次最大....依次递归;

 

以上是关于堆排序的主要内容,如果未能解决你的问题,请参考以下文章

选择排序(简单选择排序堆排序的算法思想及代码实现)

排序--08---堆排序

python代码实现堆排序

算法-java代码实现堆排序

一文带你了解堆排序

堆排序