【大话数据结构C语言】70 快速排序

举报
CodeAllen 发表于 2021/10/29 23:13:24 2021/10/29
【摘要】 目录 背景 快速排序 复杂度 快速排序的优化 背景 快速排序是图灵奖获得者 Tony Hoare设计提出的 快速排序被誉为20世纪十大算法之一   希尔排序是直接插入排序的升级,属于插入排序 堆排序是简单选择排序的升级,属于选择排序类 快速排序是冒泡排序的升级,属于交换...

目录

背景

快速排序

复杂度

快速排序的优化


背景

快速排序是图灵奖获得者 Tony Hoare设计提出的
快速排序被誉为20世纪十大算法之一
 
希尔排序是直接插入排序的升级,属于插入排序
堆排序是简单选择排序的升级,属于选择排序类
快速排序是冒泡排序的升级,属于交换排序类
 
快速排序是增加了记录的比较和移动的距离,将关键字较大的记录从前面直接移到后面,关键字较小的记录从后边直接移到前面,从而减少了比较次数和移动交换的次数
 
 

快速排序

快排的基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则可以对这两部分记录继续进行排序,以达到整个序列有序的目的
 

复杂度

快排的时间复杂度:
在最优的情况下为nlogn
最坏的情况下为n方
平均情况:nlogn
 
空间复杂度:logn
 
由于关键字的比较和交换是交换式的,因此,快排是一种不稳定的排序方法
 
 

   
  1. #include <stdio.h>
  2. void swap(int k[], int low, int high)
  3. {
  4. int temp;
  5. temp = k[low];
  6. k[low] = k[high];
  7. k[high] = temp;
  8. }
  9. int Partition(int k[], int low, int high)
  10. {
  11. int point;
  12. point = k[low];
  13. while( low < high )
  14. {
  15. while( low < high && k[high] >= point )
  16. {
  17. high--;
  18. }
  19. swap(k, low, high);
  20. while( low < high && k[low] <= point )
  21. {
  22. low++;
  23. }
  24. swap(k, low, high);
  25. }
  26. return low;
  27. }
  28. void QSort(int k[], int low, int high)
  29. {
  30. int point;
  31. if( low < high )
  32. {
  33. point = Partition(k, low, high);
  34. QSort(k, low, point-1);
  35. QSort(k, point+1, high);
  36. }
  37. }
  38. void QuickSort(int k[], int n)
  39. {
  40. QSort(k, 0, n-1);
  41. }
  42. int main()
  43. {
  44. int i, a[10] = {4, 2, 5, 0, 3, 9, 1, 7, 6, 8};
  45. QuickSort(a, 10);
  46. printf("排序后的结果是:");
  47. for( i=0; i < 10; i++ )
  48. {
  49. printf("%d", a[i]);
  50. }
  51. printf("\n\n");
  52. return 0;
  53. }

快速排序的优化

 
1.优化选取基准点
2.优化不必要的交换
3.优化小数组时的排序方案
4.优化递归操作
 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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