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

最近在学算法,学到快速排序心得就和你们分享一下。如下代码为c作演示,看不懂代码没关系,作参考就行了,主要为了明白快速排序思路。但愿能帮助到你们。

快速排序分为4个步骤算法

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

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

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

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

  • 找到了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号)球号小的,右边都是比队长大的get

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

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

#include <stdio.h>
#include <stdlib.h>
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<right && a[right]>=base)
            right--;
        // 2.1 与左指针所在位置进行交换
        a[left] = a[right];
     
        // 3.若是左边小于基准数则继续递增迭代至大于基准数中止
        while(left<right && a[left]<=base)
            left++;
        // 3.1 与右指针所在位置进行交换
        a[right] = a[left];
        
        
    }
    // 4.1 左右坐标相遇替换基准数
    a[left] = base;
     
    // 5.重复1.2.3.4 递归
    quicksort(i, left-1); // 重复基准数左边
    quicksort(left+1, j);
    return;
}
int main()
{
    int i,j;
    printf("=============快速排序==============\r\n");
    printf("请输入数量:");
    scanf("%d", &n);
    for (i=1; i<=n; i++){
        scanf("%d", &a[i]);
    }
    
    quicksort(1, n);
    printf("快速排序结果:\r\n");
    
    for (i=1; i<=n; i++)
        printf("%d ", a[i]);
   
    getchar(); getchar();
    system("pause");
    return 0;
}

本文作为技术参考,也欢迎大神们指导和批评,但愿对你们有帮助。sort

相关文章
相关标签/搜索