堆排序

举报
香菜聊游戏 发表于 2021/07/15 01:31:28 2021/07/15
【摘要】 1、堆定义:堆就是左右孩子小于或者大于父节点   2、排序思想: 堆排序使用一种称为“筛”的运算进行节点数据的调整,直到使节点最后满足堆的条件。 已调整A[i] 1) q 通常堆是通过一维数组来实现的。在起始数组为 0 的情形中: 父节点i的左子节点在位置 (2*i+1); 父节点i的右子节点在位置 (2*i+2); 子节点i的父节点在位置 ...

1、堆定义:堆就是左右孩子小于或者大于父节点  

2、排序思想:

堆排序使用一种称为“筛”的运算进行节点数据的调整,直到使节点最后满足堆的条件。

已调整A[i]

1) q

通常堆是通过一维数组来实现的。在起始数组为 0 的情形中:

  • 父节点i的左子节点在位置 (2*i+1);
  • 父节点i的右子节点在位置 (2*i+2);
  • 子节点i的父节点在位置 floor((i-1)/2);

  
  1. #include <cstdlib>
  2. #include <iostream>
  3. /**
  4. 0 1 2 3 4 5 6
  5. 子树的索引 j = 2*i+1
  6. 0
  7. 1___|____2
  8. 3_|_4 5_|_6
  9. */
  10. using namespace std;
  11. void HeapAdjust(int a[],int s,int n)
  12. {
  13. int j ,t;
  14. while(2*s+1<n){//第s个节点有左子树
  15. //让 j 指向子树中较大的一个
  16. j= 2*s+1;
  17. if((j+1)<n){//有右子树
  18. if(a[j]<a[j+1])//右子树比较大
  19. j++;
  20. }
  21. //交换
  22. if(a[s]<a[j])
  23. {
  24. t = a[s];
  25. a[s] = a[j];
  26. a[j] = t;
  27. s = j;
  28. }
  29. else//不需要调整了
  30. break;
  31. }
  32. }
  33. void HeapSort(int a[],int n)
  34. {
  35. int t,i,j;
  36. for(i = n/2-1;i>=0;i--)//从最末级开始调整
  37. HeapAdjust(a,i,n);//建堆
  38. for(i = n-1;i>=0;i--)
  39. {
  40. t = a[0];
  41. a[0] = a[i];
  42. a[i] = t;
  43. HeapAdjust(a,0,i);
  44. }
  45. }
  46. int main(int argc, char *argv[])
  47. {
  48. int a[] = {1,6,2,77,4,99,5};
  49. HeapSort(a,7);
  50. for(int i =0;i<7;i++){
  51. cout<<a[i]<<" ";
  52. }
  53. cout<<endl;
  54. system("PAUSE");
  55. return EXIT_SUCCESS;
  56. }


 

文章来源: gamwatcher.blog.csdn.net,作者:香菜聊游戏,版权归原作者所有,如需转载,请联系作者。

原文链接:gamwatcher.blog.csdn.net/article/details/9323109

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。