快速排序算法详细讲解c++版

布满荆棘的人生 2022-06-03 01:49 265阅读 0赞
  1. 快速排序算法

1.首先我需要对快速排序算法下个定义:什么是快排呢?或者是排序的指导思想比如一个待排序的数组
int iArray[] = {5,4,45,878,45}; 我们需要把这个数组从小到大进行排序。
我们首先需要找到一个参数轴 也就是参数的数据 有了参考数据我们就把数据分成2个部分,一个数据全部是大于或者等于当前参考数据,另一部分数据都是小于或者等于当前参考数据的。

下面分析快排算法的执行过程。 假如开始我们得到一个参考数值是第一个也就piovt = 5
这个时候我们的目的就是要实现5这个数的右边都是大于或者等于他,反之左边都是小于或者等于他的
我们是采用2个索引指示器int leftIndex = 0; 这个指示器我们开始是保存了第一个元素
int rightIndex = 4 保存了数组中最后一个数据 首先我们会把这个piovt轴值先保存下来,这样当前轴对应的内存区域就可以被其他数据覆盖了。 这个时候由于我们右端都是大于5的数,因此我们第一趟快排可以先从右边找到一个小于5的数 然后保存在当前piovt空出来的位置。 比如我们找到的数据就是4 这个时候我们就把4写入到5这个位置去了,这个时候leftIndex++操作这个5提前保存在了临时piovt变量中,不用担心被覆盖,这个时候4位置的内存数据就可以被覆盖了。 现在我们在从左边也就是leftIndex指示的位置开始找一个比5要大的数据 这个时候我从索引为1开始找
这个时候注意 我们从右边和左边找的索引已经相当因此这轮查询操作完毕 什么意思就是说我们当前这个数据已经被调整过,不能重复去调整
第一轮排序之后得到的数组就是4 4 45 878 45 索引1对应的内容是可以被覆盖的 5的那个值被提前保存在了piovt中

现在开始第二轮排序 这个时候的leftIndex =1 rightIndex = 1 我们这个时候发现左右指示器已经相等了,说明右边的数据都是大于5的了 左边的数据都已经小于5了
那么我们就可以把这个轴值写入到当前的空位中 也就是索引为1 这个时候数组就变成了
4 5 45 878 45 我们发现5两边的数据大小的规则是符号我们需要的

这个时候5已经把数据分成2部分了 这个时候我在用递归 我们专门针对 4 和 45 878 45 这2部分分别在进行快排。 其实在快排之前我们需要做个判断数据是不是大于1 否则就没有必要在排序了

下面来上具体代码

  1. #include "stdafx.h"
  2. #include<iostream>
  3. void QuickSort(int iArray[],int left, int right)
  4. {
  5. //快速排序之前先判断一下当前待排序数组元素个数是不是大于1 否则就没有必要排序
  6. if (left >= right)
  7. {
  8. //直接退出排序代码 没有必要进行排序了
  9. return;
  10. }
  11. //开始进行快排算法
  12. //首先我们先保存left索引对应的数据 当前数据作为切割数组的轴
  13. int piovt = iArray[left];
  14. //定义临时变量保存数组2端的索引
  15. int leftIndex = left;
  16. int rightIndex = right;
  17. while (leftIndex < rightIndex)
  18. {
  19. //现在我们通过循环从右边开始搜索一个比轴值小的数据
  20. while (leftIndex < rightIndex)
  21. {
  22. //如果右边的数大于当前的参数轴值
  23. if (piovt <= iArray[rightIndex])
  24. {
  25. //右端索引指示器左移
  26. rightIndex--;
  27. }
  28. else
  29. {
  30. //说明我们右端出现比轴值更大的数据
  31. //这个时候我们就可以把这个更大的数据填充到索引轴索引对应的地方
  32. iArray[leftIndex] = iArray[rightIndex];
  33. leftIndex++;
  34. //我们需要跳出循环了当前工作完毕
  35. break;
  36. }
  37. }
  38. //从左边开始搜索一个比轴值更大的数填写上次留下的坑
  39. while (leftIndex < rightIndex)
  40. {
  41. //如果左边的数据小于轴值 我们索引指示器就往右走
  42. if (piovt >= iArray[leftIndex])
  43. {
  44. leftIndex++;
  45. }
  46. else
  47. {
  48. //说明我们在左端找到了比轴值更大的数据
  49. iArray[rightIndex] = iArray[leftIndex];
  50. rightIndex--;
  51. break;
  52. }
  53. }
  54. }
  55. iArray[leftIndex] = piovt;
  56. QuickSort(iArray, left, leftIndex - 1);
  57. QuickSort(iArray, rightIndex + 1, right);
  58. }
  59. int main()
  60. {
  61. int arry[] = { 3,21,87,1,21,10 };
  62. QuickSort(arry, 0, 5);
  63. for (int i = 0; i < 6; i++)
  64. {
  65. std::cout << arry[i] << std::endl;
  66. }
  67. return 0;
  68. }

快速排序算法的时间复杂度分析:……..

发表评论

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

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

相关阅读

    相关 快速排序算法讲解

    看到名字,感觉很腻害,嗯,今天我们来讲解下这个比较腻害的算法 思路如下: 首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有

    相关 快速排序算法——C/C++

    快速排序 1. 算法思想 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行