堆排序

邮差的信 提交于 2020-03-08 10:54:19

基本思想:

  • 堆排序是利用堆这种数据结构设计的一种排序算法,它是选择排序的一种。通过堆来进行数据选择。
  • 堆是一个近似完全二叉树的结构,同时满足的性质:子结点的键值或索引总是小于(或者大于)它的父节点。
  • 排升序要建大堆,排降序建小堆。

代码实现:

void Swap(int *a, int *b)
{
       int t = *a; 
       *a = *b; 
       *b = t;
}
void AdjustDown(int array[], int size, int r)
{
       int left = 2 * r + 1;
       int right = 2 * r + 2;
       if (left >= size)
       {
              return;
       }
       int m = left;       
       if (right < size && array[right] > array[left])
       {
              m = right;
       }
       if (array[r] >= array[m])
       {
              return;
       }
       Swap(array + r, array + m);
       AdjustDown(array, size, m);
}
// 建堆
void CreateHeap(int array[], int size)
{
       for (int i = (size - 1 - 1) / 2; i >= 0; i--)
       {
              AdjustDown(array, size, i);
       }
}
// 排序
void HeapSort(int array[], int size)
{
       CreateHeap(array, size);
       for (int i = 0; i < size; i++)
       {
              Swap(array, array + size - 1 - i);
              AdjustDown(array, size - 1 - i, 0);
       }
}

特性总结:

  1. 堆排序使用堆来选数,效率就高了很多。
  2. 时间复杂度:O(N*logN)。
  3. 空间复杂度:O(1)。
  4. 稳定性:不稳定。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!