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后面的数分开成两堆,再做同样的事情。

四、快速排序算法代码

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

//先看这部分            //一个数组   //这一堆第几是开始
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;
    }

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

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);
    }
}

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

五、纯净代码

    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;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/783120.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库之MQL

1&#xff0c;查询所有 mysql> select * from grade;2&#xff0c; mysql> select id,firstname,lastname from grade;3&#xff0c; mysql> select firstname,lastname from grade where id > 4;4&#xff0c; mysql> select * from grade where sex f;5&…

『SD』比例切换插件 sd-webui-aspect-ratio-helper(附插件)

本文简介 ✨ 告别手动计算&#xff0c;SD绘图神器来啦&#xff01; &#x1f494; 是不是每次使用SD绘图时&#xff0c;都要自己手动去计算图片的宽高比&#xff0c;感觉好繁琐啊&#xff1f; &#x1f389; 今天就来给各位工友安利一个超实用的插件——sd-webui-aspect-ratio-…

【kubernetes集群如何更改所有节点IP】

kubernetes集群如何更改所有节点IP 情景描述更换IP前的准备工作更换IP后的工作--master更换IP后的工作--node节点重新部署之前那些服务 情景描述 我有三台服务器&#xff0c;想要将其组成了一个kubernetes集群&#xff0c;在部署之前&#xff0c;我就对其进行了固定IP的操作&a…

C++、QT企业管理系统

目录 一、项目介绍 二、项目展示 三、源码获取 一、项目介绍 人事端&#xff1a; 1、【产品中心】产品案列、新闻动态的发布&#xff1b; 2、【员工管理】新增、修改、删除、搜索功能&#xff1b;合同以图片的方式上传 3、【考勤总览】根据日期显示所有员工上班、下班时间…

springboot331+vue“有光”摄影分享网站系统+论文+源码+讲解

第3章 系统分析 3.1 可行性分析 3.1.1技术可行性 研发设计程序流程挑选面向对象设计、功能齐全、简单实用的Java编程设计核心理念。MySQL数据库存储数据。Idea工具作为编程软件&#xff0c;win10计算机操作系统作为应用系统&#xff0c;以及数据库可视化工具等技术职称。一般…

十款绚丽的前端 CSS 菜单导航动画

CSS汉堡菜单是一种非常流行的PC端和移动端web菜单风格&#xff0c;特别是移动端&#xff0c;这种风格的菜单应用更为广泛。这款菜单便非常适合在手机App上使用&#xff0c;它的特点是当顶部菜单弹出时&#xff0c;页面内容将会配合菜单出现适当的联动&#xff0c;让整个页面变得…

【软件分享】我们为分类而生—eCognition

分类是各位小伙伴入门遥感需要做的一项基础的工作&#xff0c;在进行遥感影像中的地物进行分类和提取时&#xff0c;如何提高分类精度&#xff0c;常常令人头疼。今天小编带来此前接触过的一个工具&#xff0c;他的名字是—eCognition&#xff0c;感觉比ENVI好用&#xff0c;在…

Java-01-源码篇-04集合-05-SortedMap NavigableMap TreeMap

目录 一&#xff0c;SortedMap 二&#xff0c;NavigableMap 三&#xff0c;TreeMap 3.1 TreeMap 继承结构 3.2 TreeMap 属性 3.3 TreeMap 构造器 3.4 TreeMap 内部类 3.4.1 Values 3.4.2 KeySet 3.4.3 EntrySet 3.4.5 相关集合迭代器 3.4.5.1 PrivateEntryIterato…

使用langchain与你自己的数据对话(二):向量存储与嵌入_langchain chat with your data

之前我以前完成了“使用langchain与你自己的数据对话(一)&#xff1a;文档加载与切割这篇文章&#xff0c;没有阅读的朋友可以先阅读一下&#xff0c;今天我们来继续讲解第三门课&#xff1a;向量存储与嵌入。 Langchain在实现与外部数据对话的功能时需要经历下面的5个阶段&am…

【智能制造-11】X型焊枪和C型焊枪

手工焊枪分为X型焊枪和C型焊枪两种。 X焊枪中&#xff0c;气缸活塞杆与活动枪臂体之间以轴连接&#xff0c;气缸活塞做直线运动&#xff0c;焊枪臂绕转轴摆动&#xff0c;进行焊接。 C型焊枪中&#xff0c;气缸活塞杆与活动枪臂联动&#xff0c;进行直线往复运动&#xff0c;进…

简单实现联系表单Contact Form自动发送邮件

如何实现简单Contact Form自动邮件功能&#xff1f;怎样简单设置&#xff1f; 联系表单不仅是访客与网站所有者沟通的桥梁&#xff0c;还可以收集潜在客户的信息&#xff0c;从而推动业务的发展。AokSend将介绍如何简单实现一个联系表单&#xff0c;自动发送邮件的过程&#x…

声明一个类模板,利用它分别实现两个整数、浮点数和字符的比较,求出大数和小数

在之前的文章中曾介绍了函数模板&#xff0c;对于功能相同而数据类型不同的一些函数&#xff0c;不必定义各个函数&#xff0c;可以定义一个可对任何类型变量进行操作的函数模板&#xff0c;在调用函数时&#xff0c;系统会根据实参的类型&#xff0c;取代函数模板中的类型参数…

应用层协议原理——因特网提供的运输服务

我们已经考虑了计算机网络能够一般性地提供的运输服务。现在我们要更为具体地考察由因特网提供的运输服务类型。因特网(更一般的是TCP/IP网络)为应用程序提供两个运输层协议&#xff0c;即UDP和TCP。当软件开发者为因特网创建一个新的应用时&#xff0c;首先要做出的决定是&…

游戏AI的创造思路-技术基础-决策树(2)

上一篇写了决策树的基础概念和一些简单例子&#xff0c;本篇将着重在实际案例上进行说明 目录 8. 决策树应用的实际例子 8.1. 方法和过程 8.1.1. 定义行为 8.1.2. 确定属性 8.1.3. 构建决策树 8.1.4. 实施行为 8.1.5. 实时更新 8.2. Python代码 8. 决策树应用的实际例子…

大模型网信办备案全网最详细说明【+流程+附件】

根据目前公开的国内大模型算法备案统计来看&#xff0c;首批境内深度合成服务算法备案清单&#xff0c;总共通过41家&#xff0c;14家互联网大厂和独角兽企业成功申报算法备案32个&#xff0c;6家新兴互联网公司成功申报算法备案9个&#xff0c;仅占比21.9%。 第二批境内…

Python标准库常用模块的典型用法介绍与案例

目录 1. os模块 典型用法 案例 2. sys模块 典型用法 案例 3. datetime模块 典型用法 案例 4. re模块 典型用法 案例 5. json模块 典型用法 案例 6. random模块 典型用法 案例 7. collections模块 典型用法 案例 总结 Python作为一门功能强大的编…

控件-ProgressBar

常用属性 1.android:max:进度条的最大值 2. android: progress:进度条已完成进度值 3. android: indeterminate:如果设置成true,则进度条不精确显示进度 4.style"?android:attr/progressBarStyleHorizontal"水平进度条 案例 进度条加载

探索TXE、TC、RXNE标志位在串口通信中的轮询与中断应用

浅谈一下STM32串口中断之TXE,TC,RXNE标志位 之前做一个项目&#xff0c;用到了串口中断&#xff0c;但是对TXE、TC和RXNE标志位的作用和使用方法不是很清楚&#xff0c;导致在调试过程中遇到了一些问题。通过查阅相关资料和实际操作&#xff0c;我对这三个标志位有了更深入的了…

Python酷库之旅-第三方库Pandas(010)

目录 一、用法精讲 22、pandas.read_hdf函数 22-1、语法 22-2、参数 22-3、功能 22-4、返回值 22-5、说明 22-6、用法 22-6-1、数据准备 22-6-2、代码示例 22-6-3、结果输出 23、pandas.HDFStore.put方法 23-1、语法 23-2、参数 23-3、功能 23-4、返回值 23-5…

【数据分析】Pandas_DataFrame读写详解:案例解析(第24天)

系列文章目录 一、 读写文件数据 二、df查询数据操作 三、df增加列操作 四、df删除行列操作 五、df数据去重操作 六、df数据修改操作 文章目录 系列文章目录前言一、 读写文件数据1.1 读写excel文件1.2 读写csv文件1.3 读写mysql数据库 二、df查询数据操作2.1 查询df子集基本方…