排序——堆排序

墨蓝 2022-05-21 12:05 321阅读 0赞

堆排序代码

  1. #include <iostream>
  2. using namespace std;
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. //堆调整,构建大顶堆,arr[]是待调整的数组,i是待调整的数组
  6. //元素的位置,length是数组的长度
  7. void HeapAdjust(int arr[], int i, int length)
  8. {
  9. int Child;
  10. int temp;
  11. for(;2 * i + 1 < length; i = Child)
  12. {
  13. //子节点的位置 = 2 * (parent(父结点)) + 1
  14. Child = 2 * i + 1;
  15. //得到子结点中较大的结点
  16. if(Child < length - 1 && arr[Child + 1] > arr[Child])
  17. ++Child;
  18. //如果较大的子结点大于父结点那么把较大的子结点往上移动
  19. //替换它的父结点
  20. if(arr[i] < arr[Child])
  21. {
  22. temp = arr[i];
  23. arr[i] = arr[Child];
  24. arr[Child] = temp;
  25. }
  26. else
  27. break;
  28. }
  29. }
  30. //堆排序算法
  31. void HeapSort(int arr[], int length)
  32. {
  33. int i;
  34. //调整序列的前半部分元素,调整完之后第一个元素
  35. //是序列的最大元素,length/2-1是最后一个非叶子结点
  36. for(i = length/2 - 1; i >= 0; --i)
  37. HeapAdjust(arr, i, length);
  38. //从最后一个元素开始对序列进行调整,不断的缩小调整
  39. //的范围直到第一个元素
  40. //循环里是把第一个元素和当前的最后一个元素交换
  41. //保证当前的最后一个位置的元素是现在这个序列的最大的
  42. //不断的缩小调整heap的范围,每一次调整完毕保证第一个
  43. //元素是当前序列的最大的元素
  44. for(i = length - 1; i > 0; --i)
  45. {
  46. arr[i] = arr[0]^arr[i];
  47. arr[0] = arr[0]^arr[i];
  48. arr[i] = arr[0]^arr[i];
  49. HeapAdjust(arr, 0, i); //递归调整
  50. }
  51. }
  52. int main() {
  53. // insert code here...
  54. int a[100];
  55. int c=0;
  56. int i=1;
  57. scanf("%d",&a[i]);
  58. while(a[i]!=0)
  59. {
  60. //printf("%d %d\n",i,a[i]);
  61. i++;
  62. scanf("%d",&a[i]);
  63. c++;
  64. }
  65. HeapSort(a, c+2);
  66. for(int i=1;i<c;i++)
  67. {
  68. printf("%d ",a[i]);
  69. }
  70. printf("%d",c);
  71. printf("\n");
  72. return 0;
  73. }

发表评论

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

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

相关阅读

    相关 排序算法——排序

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

    相关 排序-排序

    1.堆排序前言 前面博客中讲到简单选择排序,它在待排序的n个记录中选择一个最小的记录需要比较n-1次。本来这也可以理解,查找第一个数据需要比较这么多次是正常的,否则如何知

    相关 排序算法:排序

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

    相关 排序算法---排序

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

    相关 排序-排序

    [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] 在说明堆排序的过程前得先了解什么是堆: 先看下图(来源