排序算法——堆排序

ゝ一纸荒年。 2022-06-12 00:00 303阅读 0赞

前言

对于推排序它像合并排序而不像插入排序,堆排序的运行时间为O(nlogn)。像插入排序而不像合并排序,它是一种原地排序算法:在任何时候,数组中只有常数和元素存储在输入数组以外。这样堆排序就拥有了两种排序算法的优点。

堆算法中涉及到的主要算法有:维持最大堆(Max_Heapify)和建立堆(Build_Max_Heap)。

1. 编码实现

这里为了使得数组的下标是从1开始计算的,在数组的首部插入了元素-1 。

1.1 维护最大堆

  1. //维持堆性质
  2. int heap_size = 0; //堆中元素
  3. void Max_Heapify(std::vector<int>& vec, int pos) //pos为当前操作的根位置
  4. {
  5. int left(pos*2);
  6. int right(pos*2+1);
  7. //求出最大的根节点
  8. int root_pos(-1);
  9. if(left<=heap_size && vec[pos]<vec[left])
  10. {
  11. root_pos = left;
  12. }
  13. else
  14. {
  15. root_pos = pos;
  16. }
  17. if(right<=heap_size && vec[root_pos]<vec[right])
  18. {
  19. root_pos = right;
  20. }
  21. //不满足最大堆的性质了,因为比较之后求出来的根节点和输入的节点不一样
  22. if(root_pos != pos)
  23. {
  24. std::swap(vec[root_pos], vec[pos]);
  25. Max_Heapify(vec, root_pos);
  26. }
  27. }

1.2 创建最大堆

  1. //创建堆
  2. void Build_Max_Heap(std::vector<int>& vec)
  3. {
  4. //由于堆中有heap_size/2~heap_size 的元素为叶子节点,因而只需要迭代heap_size/2次
  5. for(int i=(heap_size/2); i>=1; --i)
  6. {
  7. Max_Heapify(vec, i);
  8. }
  9. }

1.3 堆排序

  1. //堆算法
  2. void HeapSort(std::vector<int>& vec)
  3. {
  4. int len(vec.size());
  5. if(len == 0) return;
  6. cout << "display origin array:" << endl;
  7. for_each(vec.begin(), vec.end(), Disp<int>()); //打印原始的数据
  8. std::vector<int> temp = vec;
  9. heap_size = vec.size();
  10. temp.insert(temp.begin(), -1);
  11. Build_Max_Heap(temp);
  12. int loop = heap_size;
  13. for(int i=heap_size; i>=1; --i)
  14. {
  15. vec[i-1] = temp[1];
  16. std::swap(temp[1], temp[i]);
  17. temp.pop_back();
  18. --heap_size;
  19. Max_Heapify(temp, 1);
  20. }
  21. cout << "\narray sorted:" << endl;
  22. for_each(vec.begin(), vec.end(), Disp<int>());
  23. }

SouthEast

发表评论

表情:
评论列表 (有 0 条评论,303人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序算法——排序

    排序算法——堆排序 > 堆排序是利用堆这种数据结构所设计的一种排序算法。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点

    相关 排序算法-排序

    堆是一个完全二叉树 堆排序是指利用堆这种数据结构所设计的一种排序算法 大顶堆:每个结点的值都大于或等于其左右孩子结点的值 arr\[i\] >= arr\[2i+1

    相关 排序算法-排序

    堆排序算法是建立在堆这种数据结构的基础上,其实堆听着很高端,其实很简单,就是一个二叉树,但是又特殊条件,就是其父节点比孩子节点都大(或都小)的堆称为最大堆(最小堆),瞬间感觉很

    相关 排序算法——排序

    前言 对于推排序它像合并排序而不像插入排序,堆排序的运行时间为O(nlogn)。像插入排序而不像合并排序,它是一种原地排序算法:在任何时候,数组中只有常数和元素存储在输入

    相关 排序算法排序

    一、前言     堆排序是一种选择排序。     选择排序:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止。 ----

    相关 排序算法排序

      相关博客: [排序算法:冒泡排序、插入排序、选择排序、希尔排序][Link 1] [排序算法:归并排序、快速排序][Link 2] [排序算法:桶排序、计数排序、基

    相关 排序算法---排序

    二叉堆是完全二叉树或者是近似完全二叉树。 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 2.每个结点的左子树和右子树都是一个二