C# 快速排序算法的详细讲解

目录

一、前言

二、例子

三、快速排序算法图片讲解

四、快速排序算法代码

五、纯净代码


一、前言

用比较好懂的方式讲一下快速排序算法。

二、例子

如果我有一堆钱,想数清楚,最快的方案是什么?
图1 一堆钱

答:先分类,一百的一堆,十块的一堆.....,如果还是多,那再把100的分成两三堆,再每堆每堆数。

快速排序就是这样,先分类再排序,再分类,再排序。

三、快速排序算法图片讲解

但是怎么分呢?按照第一个数字分。我们先随便拿一组数字,第一个数是5。(如图2所示)
图2 一堆数

我们接下来就按照快速排序算法,用这个数字过一遍。

第一步:把第一个数拿出来 5拿出来(如图3所示)
图3 把5拿出来

然后我们就发现,第一位空了出来,接下来,我们做一个分类,把比5小的都往前拿,比5大的都往后拿 。

第二步:因为第一位是空的,所以我们就从后往前找一个比5小的数,填到第一位去。

过程: 我们发现,从后往前数,2是第一个比5小的,就把2放到前面去。(如图4所示)
图4 把2往前放

这里我们记一下,2原来的位置是正数第7位。也就是说,7位往后都比5大,不用再关心了。

再然后,我们发现,后面空了一位出来, 我们再从前往后数,把比5大的挪到后面去。

第三步:因为后面是空的,所以我们就从前往后找一个比5大的数,填过去。

过程: 我们发现,从前往后数,第二位,数字7,是比5大的,我们把数字7挪到后面去。(如图5所示)
图5 把7往后放

现在空出来的是前面的格子,并且,7往后的数字都是比较过的,都比5大,所以我们从7往前数,继续找比5小的。

第四步:因为前面是空的,所以我们就从第七位往前找一个比5小的数,填过去。

过程: 我们发现,继续往前数,1是比5小的,把1放到前面去。(如图6所示)
图5 把1往前放

第五步:因为后面是空的,所以我们从第二位往后找一个比5大的数,填过去。

过程: 继续往后数,6是比5大的,把6放到前面去。(如图6所示)
图6 把6往后放

第六步:因为前面是空的,所以我们就从第六位往前找一个比5小的数,填过去。

过程: 继续往前数,3是比5小的,把3放到前面去。(如图7所示)
图6 把3往前放

第七步:所有的交换都完成了,现在左边都是比5小的,右边都是比5大的。最后把5填回去。(如图7所示)
图7 把5放回去

第8步:把5前面的数和5后面的数分开成两堆,再做同样的事情。

四、快速排序算法代码

我们先把刚才图片示例的部分用代码写出来。

cs 复制代码
//先看这部分            //一个数组   //这一堆第几是开始
public int Partition(List<int> li, int left, int right)
                                            //这一堆第几个是结束
{
      //把第一位先拿出来,就是那个5
      int tmp = li[left];

      //因为我也从左边数,也从右边数,他们还没数到一起的时候
        while (left<right)
        {
            //空位在左边,所以从右边数 
                  //到左边前        //如果比5大
            while (left < right&&li[right]>=tmp)      
            {
                //继续往前找
                right--;
            }

            //找到了比5小的,就把它放到左边空的位置
            li[left] = li[right];

            //现在空位就去右边了,再从左边开始找比5大的
                 //到最右边前      //如果比5小
            while (left < right && li[left] <= tmp)
            {
                //继续往后找
                left++;
            }
            //找到了比5大的,填到后面去
            li[right] = li[left];

            //如果没有找完,就继续找,如果找完了,就走下面的代码
        }

        //都找完了,把5填回去
        li[left] = tmp;//最后把元素填回去

        //把5的位置返回去,因为后面要从5的位置分成左一半,右一半
        return left;
    }

我们使用上面的代码,进行完整的排序。

cs 复制代码
public void QuickSort(List<int> li,int left,int right)
{
    //中间位初始化
   int mid = 0;
 
   if (left<right)
   {
      //这个就是上面的代码,返回了刚才5的位置,
      mid = Partition(li,  left, right);

      //我们把数组劈成了两半
      //5左边的,重新去执行一遍排序
      QuickSort(li,left,mid-1);
      //5右边的,重新去执行一遍排序 
      QuickSort(li, mid+1, right);
    }
}

然后他们就和套娃一样,不停的一分为二,不停的排序,直到全部排序完成。

五、纯净代码

cs 复制代码
    public void QuickSort(List<MScrollSlot> li, int left, int right)
    {
        int mid = 0;

        if (left < right)
        {
            mid = Partition(li, left, right);
            QuickSort(li, left, mid - 1);
            QuickSort(li, mid + 1, right);
        }
    }
    public int Partition(List<MScrollSlot> li, int left, int right)
    {
        MScrollSlot tmp = li[left];

        while (left < right)
        {
            while (left < right 
                && li[right].GetScale() >= tmp.GetScale())
            {
                right--;
            }

            li[left] = li[right]; 
            while (left < right && li[left].GetScale() <= tmp.GetScale())
            {
                left++;
            }
            li[right] = li[left];
        }
        li[left] = tmp;
        return left;
    }
相关推荐
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
爱敲代码的憨仔1 小时前
《线性代数的本质》
线性代数·算法·决策树
yigan_Eins2 小时前
【数论】莫比乌斯函数及其反演
c++·经验分享·算法
阿史大杯茶2 小时前
AtCoder Beginner Contest 381(ABCDEF 题)视频讲解
数据结构·c++·算法
დ旧言~2 小时前
【高阶数据结构】图论
算法·深度优先·广度优先·宽度优先·推荐算法
张彦峰ZYF2 小时前
投资策略规划最优决策分析
分布式·算法·金融
The_Ticker3 小时前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
爪哇学长3 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
Dola_Pan3 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
繁依Fanyi4 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse