当前位置: 首页 > news >正文

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)//这一堆第几个是结束
{//把第一位先拿出来,就是那个5int 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;}

相关文章:

  • Python (Ansbile)脚本高效批量管理服务器和安全
  • uniapp开发H5、手机APP、微信小程序 可拖动菜单按钮
  • YOLO10 用分割数据集训练
  • Java 重载和重写
  • qt可点击的QLabel
  • nacos开启鉴权后,springboot注册失败
  • STC89C52RC单片机设计的FM收音机+自动搜台+存储电台(程序+原理图+PCB)
  • CC6利用链分析
  • BeanUtils拷贝List数据
  • 无忧易售功能:刊登页面文本翻译,无缝对接全球买家
  • DDR自学笔记
  • 前端利用vue如何实现导入和导出功能.md
  • springboot @configuration注解的配置, @bean注解方法a, 在@bean注解 getb(){}需要注入a
  • llm学习-3(向量数据库的使用)
  • 04-《黄蜀葵》
  • 「面试题」如何实现一个圣杯布局?
  • JavaWeb(学习笔记二)
  • Js基础知识(一) - 变量
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • REST架构的思考
  • Ruby 2.x 源代码分析:扩展 概述
  • vuex 笔记整理
  • Vue小说阅读器(仿追书神器)
  • web标准化(下)
  • 从零开始的无人驾驶 1
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 来,膜拜下android roadmap,强大的执行力
  • 设计模式走一遍---观察者模式
  • 小程序button引导用户授权
  • hi-nginx-1.3.4编译安装
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • (4)STL算法之比较
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (过滤器)Filter和(监听器)listener
  • (函数)颠倒字符串顺序(C语言)
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (算法)Game
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)视频码率,帧率和分辨率的联系与区别
  • .bat批处理(一):@echo off
  • .Net Core 中间件与过滤器
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net 后台导出excel ,word
  • .Net 路由处理厉害了
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET面试题(二)