【大话数据结构C语言】68 堆排序

举报
CodeAllen 发表于 2021/10/30 00:08:08 2021/10/30
【摘要】 堆排序算法是利用堆进行排序的方法 基本思想是将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根结点。 将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小值,如此反复执行,最后就可以得到一个有序序列了   堆排序的...

堆排序算法是利用堆进行排序的方法

基本思想是将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根结点。

将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小值,如此反复执行,最后就可以得到一个有序序列了

 

堆排序的时间复杂度为nlogn,这个性能要远远好于冒泡,简单选择,直接插入排序的时间复杂度

空间复杂度上,它只有一个用来交换的暂存单元,也是非常的不错

 

但是由于记录的比较与交换是跳跃式进行,因此堆排序也是一种不稳定的排序方法

另外,由于初始构建堆需要比较次数很多,所以不适合待排序个数比较少的情况

 

 


  
  1. #include <stdio.h>
  2. int count = 0;
  3. void swap(int k[], int i, int j)
  4. {
  5. int temp;
  6. temp = k[i];
  7. k[i] = k[j];
  8. k[j] = temp;
  9. }
  10. void HeapAdjust(int k[], int s, int n)
  11. {
  12. int i, temp;
  13. temp = k[s];
  14. for( i=2*s; i <= n; i*=2 )
  15. {
  16. count++;
  17. if( i < n && k[i] < k[i+1] )
  18. {
  19. i++;
  20. }
  21. if( temp >= k[i] )
  22. {
  23. break;
  24. }
  25. k[s] = k[i];
  26. s = i;
  27. }
  28. k[s] = temp;
  29. }
  30. void HeapSort(int k[], int n)
  31. {
  32. int i;
  33. for( i=n/2; i > 0; i-- )
  34. {
  35. HeapAdjust(k, i, n);
  36. }
  37. for( i=n; i > 1; i-- )
  38. {
  39. swap(k, 1, i);
  40. HeapAdjust(k, 1, i-1);
  41. }
  42. }
  43. int main()
  44. {
  45. int i, a[10] = {-1, 5, 2, 6, 0, 3, 9, 1, 7, 4};
  46. HeapSort(a, 9);
  47. printf("总共执行 %d 次比较!", count);
  48. printf("排序后的结果是:");
  49. for( i=1; i < 10; i++ )
  50. {
  51. printf("%d", a[i]);
  52. }
  53. printf("\n\n");
  54. return 0;
  55. }

 

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/117173481

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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