当前位置:   article > 正文

快速排序(C语言)_快速排序c语言代码

快速排序c语言代码

目录

一、简介

二、代码部分

2.1运行结果

三、代码部分分析

3.1核心代码

3.1.1介绍代码运行过程 

四、总结 


一、简介

中文名:快速排序

英文名:quick sort

时间复杂度:O(nlog2n)

稳定性:不稳定性的排序算法(多个相同的值的相对位置在也许会在算法结束后位置发生改变)

原理:将数组的第一个(最后一个)数组元素a,作为关键数据,将比a小的数字b放到a的左边(右边),所有比a小的数字b放到a的右边(左边),快速排序是对冒泡排序的的优化。

二、代码部分

  1. int main()
  2. {
  3. int arr[10] = {9,5,3,8,1,2,6,7,4,10};
  4. void quicksort(int a[10],int i,int j); //函数的声明
  5. printf("排列前:");
  6. for(int i = 0; i < 10;i++)
  7. {
  8. printf("%d ",arr[i]);
  9. }
  10. printf("\n");
  11. quicksort(arr,0,9); //调用函数
  12. printf("排列后:");
  13. for(int i = 0; i < 10;i++)
  14. {
  15. printf("%d ",arr[i]);
  16. }
  17. system("pause");
  18. return 0;
  19. }
  20. void quicksort(int a[10],int first,int end)
  21. {
  22. if(first > end) //递归结束条件
  23. {
  24. return;
  25. }
  26. int i = first,j = end,flag = a[i],exchange = 0;
  27. while(i != j)
  28. {
  29. while(i < j && a[j] > flag)
  30. {
  31. j--;
  32. }
  33. while(i < j && a[i] <= flag)
  34. {
  35. i++;
  36. }
  37. if(j > i)
  38. {
  39. exchange = a[i];
  40. a[i] = a[j];
  41. a[j] = exchange;
  42. }
  43. }
  44. a[first] = a[i];
  45. a[i] = flag;
  46. quicksort(a,first,i - 1);
  47. quicksort(a,i + 1,end);
  48. }

2.1运行结果

三、代码部分分析

3.1核心代码

  1. void quicksort(int a[10],int first,int end)
  2. {
  3. if(first > end) //递归结束条件
  4. {
  5. return;
  6. }
  7. int i = first,j = end,flag = a[i],exchange = 0;
  8. while(i != j)
  9. {
  10. while(i < j && a[j] > flag)
  11. {
  12. j--;
  13. }
  14. while(i < j && a[i] <= flag)
  15. {
  16. i++;
  17. }
  18. if(j > i)
  19. {
  20. exchange = a[i];
  21. a[i] = a[j];
  22. a[j] = exchange;
  23. }
  24. }
  25. a[first] = a[i];
  26. a[i] = flag;
  27. quicksort(a,first,i - 1);
  28. quicksort(a,i + 1,end);
  29. }

3.1.1介绍代码运行过程 

     原数组元素:如图: 

        首先我们先将数组的第一个元素 9 赋值给 flag ,(flag 起标记作用)。

        j 从数组元素的最后一个下标 9出发 ,每次循环 j-- ,直到找到比 flag 小的数字,再记录这个数字的下标。

        i 从数组元素的开头下标 0 出发,每次循环 i++,直到找到比 flag 大的数字,再记录这个数字的下标。

         当 i  和 j 都找到了自己相对应的数字,且  i != j 二者就交换数值。

         当 i == j 时,就和 flag 交换数值。(这也意味着第一次排序的结束)

          ① j-- 寻找比 flag 小的数字,当 j == 8,时找到 a[8] == 4 小于 9,成立;紧接着 i++ 寻找比 flag 大的数字,当 i == 8,时还是没有找到比 flag 大的数字,这时 i  == j,所以就将 a[8] 和 flag 进行交换。如下图:

           交换后(如下图): 

          接下来数组被分成了两个部分:quicksort(a,0,7)  和 quicksort(a,9,9)。

其中 quicksort(a,9,9) 的 first == end,递归结束。(即数组中元素 9 和 10 排列完成)

所以接下来,我们把焦点放到 quicksort(a,0,7) 上(如下图): 

  

           由上图可知:flag 继续记录着 a[0] 的值,j-- 寻找比 flag 小的数组元素,当 j == 5,时发现 a[5] == 2 小于 flag,然后我们的 i++ 出发寻找比 flag 大的数组元素,当 i == 1,时发现a[3] == 5 大于 flag,接下来到交换环节(a[1] 与 a[5] 交换),结果(如下图): 

   

          接下来 j-- 继续前进,当 j == 4,时找到了a[4] == 1 小于 flag ,i++ 出发,当 i == 3,时找到比 flag 大的数组元素 8,交换结果(如下图):

 

           紧接着,j-- 继续,当 j == 3,时 i == j,所以 a[3] 与 flag 交换数值(结果如下图):

          接下来数组被分成了两个部分:quicksort(a,0,3)  和 quicksort(a,5,7)。运行过程与前面介绍的大径相同。最终我们可以得到如下结果:

四、总结 

          快速排序优点:排列速度快,比较简单;缺点:不稳定(如果数组是递增的有序数组,对它用快速排序需要N^2/2次操作)。

最后到这里,文章就结束了,如果在内容上有问题,恳请各位大佬们指出。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/cm456/article/detail/62994
推荐阅读
相关标签
  

闽ICP备14008679号