快速排序(QuickSort) 算法思路详解

最近在学算法,学到快速排序心得就和大家分享一下。以下代码为c做演示,看不懂代码不要紧,做参考就好了,主要为了明白快速排序思路。希望能帮助到大家。

快速排序分为4个步骤

  1. 找一个基准数(参照数)
  2. 从右往左找比基准数小的数与左坐标交换
  3. 从左往右找比基准数大的数与右坐标交换
  4. 左、右坐标相遇时,基准数与相遇坐标交换
文字描述已讲述完,接下来草稿演示,也可以直接向下翻看代码,可能代码更有说服力

国足有6名队员从左到右身高排序球号为: 5号 9号 12号 3号 7号 8号

教练规定左边第一个最高的为队长(基准数):5号
教练要拆分两个队:

右边的球号要小于队长球号并且左边球号不能大于右边 找到后和左边交换位置

  • 找到了3号比5号小,与左队当前坐标交换位置
    新顺序为:3号 9号 12号 5号 7号 8号
    坐标定在第4个人

左边的球号要大于队长球号并且左边球号不能大于右边

  • 找到了9号比5号大,与右队当前坐标交换位置
    新顺序为:3号 5号 12号 9号 7号 8号
    坐标定在第2个人

然后右边继续走找比5小的,最后走到了左队坐标位置,两个相遇相等的坐标让队长(基准数)放到相遇的位置。排队完成。最终得到的顺序为:

  • 3号 5号 12号 9号 7号 8号

左队都是比队长(5号)球号小的,右边都是比队长大的

接下来就要从队长开始继续拆分左、右边和上面教练说的一样直到不能拆分为止

整个思路基本就这样,接下来代码实现:

#include 
#include 
int a[101],n;
/**
* 快速排序:
*          1.以左边第一位作为基准数,
*           2.先右边找一个比基准数小的数与左指针所在的位置进行交换    
*           3.从左边找一个比基准数大的数与右指针所在的位置进行交换
*          4.相遇后则把基准数和左、右指针重合的位置进行交换
*           5.重复1/2/3/4操作
* 注意:
*        如果左坐标大于右坐标位置则无法计算,必须左坐标小于右坐标。
*/
void quicksort(int left, int right){
    int i,j,base;
    i = left;
    j = right;
  
    if (left>right) return ;
    // 1.第一步,定义基准数
    base = a[left]; 
  
    // 4.左坐标不等于右坐标时继续迭代,等于则相遇
    while(left != right){
     
    
        // 2.如果右边大于基准数则继续递减迭代至小于基准数停止
        while(left=base)
            right--;
        // 2.1 与左指针所在位置进行交换
        a[left] = a[right];
     
        // 3.如果左边小于基准数则继续递增迭代至大于基准数停止
        while(left

本文做为技术参考,也欢迎大神们指导和批评,希望对大家有帮助。

你可能感兴趣的:(c,算法,快速排序)