首页 > 编程语言 >算法系列-快速排序

算法系列-快速排序

时间:2022-12-29 15:11:18浏览次数:48  
标签:系列 基准值 int 扫描 start 算法 end 排序 data

   今天重温一下快速排序,快速排序主要是通过从右向左和从左向右扫描,当左边的扫描标记到比基准值大的停下,右边的扫描标记标记到比基准值小的停下,然后交换左右标记处的值,每一轮当左右扫描标记相遇则本轮结束,每一轮扫描主要是把基准值放到正确的位置上,把比基准值小的放到基准值的左边,比基准值大的放到右边。

    直接上代码:

public void quickSort(int[] data,int left,int right)
{
    if(left >right)
    {
       //直接退出
        return ;
    }
    
    int baseValue=data[left];
    int start=left;
    int end=right;
    int tmp=0;
    while(start!=end)
    {
        //从右向左扫描
        while(data[end]>=baseValue&&end>start)
        {
           end--;
        }
        //从左向右扫描
        while(data[start]<=baseValue&&end>start)
        {
           start++;
        }
        
        //交换两个值得位置
        if(end>start)
        {
           tmp=data[end];
           data[end]=data[start];
           data[start]=tmp;
        }
    }
    
    //一轮遍历完成后,交换基准值
    data[left]=data[start];
    data[start]=baseValue;
    
    //递归继续下一轮遍历
    quickSort(data,left,start-1);
    quickSort(data,start+1,right);
}

  上面的代码主要通过递归来实现该排序,如果我们把这两段代码交换一下位置,效果是否是一样的呢?

 

 

  这段代码是我不经意间写反的,答案是肯定的,这两段代码的顺序不能交换,交换后就无法排出正确的顺序。为什么会有这样的差异呢,其实很简单,如果先从左向右扫描,就无法保证基准值的左边是小于它的,右边是大于它的,如下图遍历过程就未找到正确的基准值,这违背了算法定义,所以必须先从右向左扫描。

 

 

 

标签:系列,基准值,int,扫描,start,算法,end,排序,data
From: https://www.cnblogs.com/beststrive/p/17012597.html

相关文章

  • 天池-安泰杯跨境电商智能算法大赛(冠军)方案分享
    竞赛分享天池-安泰杯跨境电商智能算法大赛​--冠军团队:法国南部团队成员:Rain/Fish/楠枰在19年9月下旬结束的"安泰杯"跨境电商智能算法大赛中,来自京东零售的法国南部队伍成功......
  • Collections.sort()排序方法
    Collections.sort()方法详解是对数据进行排序的一个方法,根据指定比较器产生的顺序对指定列表进行排序。Collections.sort()排序(倒叙排序)返回值:returna.compareTo(b)......
  • js 实现版本号排序
    //方法一:从左到右迭代,从高位判断,返回高位的大小结果注意:仅适用于版本号各个位的位数相同letversions=["1.45.0","1.5","6","2.3.4.5"];versions=versions.sor......
  • 每日算法之矩形覆盖
    JZ70矩形覆盖题目我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,从同一个方向看总共有多少种不同的方......
  • 大整数排序
    题目描述小南有n个整数,这些整数都非常大,所以没有办法采用整数排序的方法处理,请聪明的你帮小南编写程序完成这些整数由小到大的排序。输入输入包含多组测试用例。......
  • 每日算法之把字符串转换成整数(atoi)
    JZ67把字符串转换成整数(atoi)题目写一个函数StrToInt,实现把字符串转换成整数这个功能。不能使用atoi或者其他类似的库函数。传入的字符串可能有以下部分组成:1......
  • 类欧几里得算法(部分)
    ##Preface欧几里得算法,就是辗转相除法。gcd(i,j)=gcd(j,i%j)##定义定义函数##推导一波显然当或者时,若当a,b均小于c怎么办?据大佬说转换成几何意义就是一条直线与x轴、y......
  • Linux内存管理-slub算法
    Slub简介Linux内核内存管理用了两个算法:伙伴算法(以页为单位的大内存)和slub算法(以字节为单位的小内存),其中slub系统运行在伙伴系统之上。slub进行内存分组管理,分......
  • m低信噪比下GPS信号的捕获算法研究,使用matlab算法进行仿真
    1.算法概述GPS系统的星座部分是由21颗工作卫星和3颗在轨备用卫星组成,其高度为20183km,这24颗卫星均匀分布在6个等间隔的、相对轨道面倾角为55º的近圆轨道上。GPS......
  • m低信噪比下GPS信号的捕获算法研究,使用matlab算法进行仿真
    1.算法概述        GPS系统的星座部分是由21颗工作卫星和3颗在轨备用卫星组成,其高度为20183km,这24颗卫星均匀分布在6个等间隔的、相对轨道面倾角为55º的近圆轨......