快速排序 C语言实现

﹏ヽ暗。殇╰゛Y 2022-12-22 11:12 268阅读 0赞

快速排序

快速排序(Quick Sort )是由冒泡排序改进而得的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序。 如果能通过两个(不相邻)记录的一次交换,消除多个逆序,则会大大加快排序的速度。快速排序方法中的一次交换可能消除多个逆序。

课本上的例子:

在这里插入图片描述
时间复杂度

最好情况:O(n l o g 2 log_2 log2​n)
最坏情况:O( n 2 n^2 n2)
平均情况:O(n l o g 2 log_2 log2​n)

空间复杂度

O( l o g 2 log_2 log2​n)

算法特点:

1)记录非顺次的移动导致排序方法是不稳定的。
2)排序过程中需要定位表的下界和上界,所有适合用于顺序结构,很难用于链式。
3)当n较大时,在平均情况下快速排序是所有内部排序方法中速度最快的一种,所以其适合初始记录无序、n较大时的情况。

完整代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAXSIZE 100 //顺序表最大容量,可以自行加大
  5. typedef struct
  6. {
  7. int key;//关键字项
  8. char *otherinfo;//其他数据项
  9. }ElemType;//记录类型
  10. typedef struct
  11. {
  12. ElemType Data[MAXSIZE+1];//静态顺序表的数据域,这里Data[0]为空闲或者为哨兵单元
  13. int length;//顺序表的长度
  14. }SqList;//顺序表
  15. void InitList(SqList &L)//顺序表的初始化
  16. {
  17. L.length = 0;//使顺序表长度归0,便是顺序表的初始化
  18. }
  19. void CreateList(SqList &L)//顺序表的创建
  20. {
  21. printf("请输入:");
  22. while(1)//建立一个死循环,循环终止条件是按了enter键
  23. {
  24. L.length++;//顺序表长度加一
  25. if(L.length>MAXSIZE)//判断是否超出最大容纳量
  26. {
  27. printf("顺序表已满!\n");
  28. return ;
  29. }
  30. scanf("%d",&L.Data[L.length].key);//顺序表数据的输入
  31. if(getchar() == '\n')//循环终止条件
  32. break;
  33. }
  34. }
  35. void InputList(SqList L)//顺序表的输出
  36. {
  37. int i;//记录次数
  38. if(L.length == 0)//判断顺序表是否为空 ,若为空结束该函数
  39. {
  40. printf("顺序表是空的!\n");
  41. return ;
  42. }
  43. printf("打印为:");
  44. for(i=1;i<=L.length;i++)//利用循环打印顺序表中的数据
  45. printf("%d ",L.Data[i].key);
  46. }
  47. int Partition(SqList &L,int low,int high)//对顺序表L中的子表Data[low…high]进行一趟排序,返回驱轴位置
  48. {
  49. L.Data[0] = L.Data[low];//用子表的第一个记录做驱轴记录
  50. while(low < high)//当low==high时终止循环 ,从表的两端交替地向中间扫描
  51. {
  52. while(low<high&&L.Data[0].key<=L.Data[high].key)
  53. high--;
  54. L.Data[low] = L.Data[high];//将比驱轴记录小的记录移到低端
  55. while(low<high&&L.Data[0].key>=L.Data[low].key)
  56. low++;
  57. L.Data[high] = L.Data[low];//将比驱轴记录大的记录移到高端
  58. }
  59. L.Data[low] = L.Data[0];//驱轴记录到位
  60. return low;//返回驱轴位置
  61. }
  62. int pivotloc;//递归函数中不宜定义变量,故定义一个全局变量
  63. void QSort(SqList &L,int low,int high)//调用前置初值:low=1;high=L.length;
  64. { //对顺序表L中的字序列L.Data[low…high]做快速排序,递归算法
  65. if(low < high)//长度大于1,递归终止条件
  66. {
  67. pivotloc = Partition(L,low,high);//将L.Data[low…high]一分为二,pivotloc是驱轴位置
  68. QSort(L,low,pivotloc-1);//对左子表递归排序
  69. QSort(L,pivotloc+1,high);//对右子表递归排序
  70. }
  71. }
  72. void QuickSort(SqList &L)//对顺序表L做快速排序
  73. {
  74. QSort(L,1,L.length);
  75. }
  76. int main()
  77. {
  78. SqList L;
  79. InitList(L);//初始化顺序表
  80. CreateList(L);//创建顺序表
  81. QuickSort(L);//快速排序
  82. InputList(L);//打印排序后结果
  83. return 0;
  84. }

在这里插入图片描述
(完)

发表评论

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

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

相关阅读

    相关 c语言实现快速排序

    快速排序是一种快速的排序算法。它的基本思想是,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别

    相关 快速排序算法(C语言实现

    快速排序算法(C语言实现) 快速排序是一种基于比较的排序算法,它采用递归分治策略来排序一个序列。快速排序算法是所有基于比较的排序算法中,平均情况下表现最好的一种算法。快速排序

    相关 快速排序C语言实现

    快速排序是一种常用且高效的排序算法,它基于分治策略,通过将数组分成较小的子数组并对它们进行排序,最终将它们合并以得到排序后的数组。下面我们将介绍如何使用C语言实现快速排序,并附