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

news2024/11/24 4:37:15

目录

一、前言

二、例子

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

四、快速排序算法代码

五、纯净代码


一、前言

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

二、例子

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)

目录 项目演示&#xff1a; 1. 主界面 技术讲解&#xff1a; TCP连接 进程的并发 链表 SQLite3 IO对文件的读写 功能实现 实现逻辑 我遇到的问题&#xff1a; 服务器端代码思路解析 必要条件 步骤详解 客户端代码思路解析 步骤详解 服务器源码如下&#xff1a;…

GD32实战项目-app inventor-BLE低功耗DX-BT24蓝牙上位机制作-文末有关于生成的软件闪退或者卡死问题的解决

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 后续项目主要在下面该专栏中发布&#xff1a; 手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转&#xff1a; 手把手教你嵌入式国产化-实战项目-无刷电机驱动&am…

什么开放式耳机好用?五大王牌开放式耳机种草!

随着科技的持续进步&#xff0c;开放式蓝牙耳机悄然兴起&#xff0c;逐步取代了经典的入耳式耳机。入耳式耳机以其卓越的隔音性能著称&#xff0c;然而&#xff0c;长时间的使用却容易引发耳道受压&#xff0c;伴随而来的不仅是疼痛与不适&#xff0c;更潜藏着耳膜受损的风险。…

C++面试宝典30题丨第一题:开灯

专栏导读 见得题目越多&#xff0c;考试时抽中的概率也越大。每一题都有详细的解答思路和独有的视频讲解。 本文收录于&#xff1a;C面试宝典&#xff08;送视频讲解&#xff09; ☆☆☆购买专栏后&#xff0c;请加微信会私发讲解视频&#xff01; 题目描述 一条名叫Mango的街…

简过网:一建和二建的含金量,哪个难度更大一些?

你知道&#xff0c;一建和二建有什么区别吗&#xff0c;考哪个更合适自己呢&#xff1f;正在备考一建、二建的小伙伴们&#xff0c;这篇文章千万不要错过哦&#xff01; 首先&#xff0c;先说一下大家比较关注的含金量问题&#xff0c;一建含金量明显比二建高&#xff0c;但是…

MySQL篇-SQL优化实战-减少子查询

回顾 上一篇了解了分析SQL使用的explain&#xff0c;可以点击查看MySQL篇-SQL优化实战了解我在写sql的注意事项还有explain的说明&#xff0c;这次拿一段生产使用的sql进行优化说明。从14s优化到2.6s 待优化的SQL SELECT DISTINCTswpe.tag_number,hca.ACCOUNT_NAME customer…

精准定位推广盲点?Xinstall数据监测让每一分投入都见成效!

在这个数字化时代&#xff0c;App的推广早已不再是简单的“上线即成功”。面对激烈的市场竞争和日益挑剔的用户&#xff0c;如何精准监测推广数据&#xff0c;优化营销策略&#xff0c;成为了每个开发者与营销人员不得不面对的挑战。而在这个关键时刻&#xff0c;Xinstall作为一…

AI 驱动的数据中心变革与前景

文章主要探讨了AI计算时代数据中心的转型&#xff0c;涉及计算技术的多样性、规格尺寸和加速器的发展、大型语言模型&#xff08;LLM&#xff09;的发展、功耗和冷却趋势、基准测试的重要性以及数据中心的发展等方面。为大家提供深入了解AI基础设施发展的视角。 计算技术的多样…

Python 程序打印图案“G”(Python Program to print the pattern ‘G’)

在本文中&#xff0c;我们将学习如何使用星号和空格打印图案 G。给定一个数字 n&#xff0c;我们将编写一个程序&#xff0c;在 n 行或列上打印图案 G。 例子&#xff1a; 输入&#xff1a;7 输出&#xff1a; *** * * * *** * * * * *** 输入&…

红酒的秘密花园:探索葡萄的种植艺术

在远离城市喧嚣的某个角落&#xff0c;隐藏着一座神秘的红酒秘密花园。这里&#xff0c;葡萄藤缠绵交织&#xff0c;绿叶间闪烁着晶莹的露珠&#xff0c;仿佛在诉说着关于红酒与葡萄种植艺术的古老传说。今天&#xff0c;就让我们一起走进这片神秘的花园&#xff0c;探寻葡萄种…

@amap/amap-jsapi-loader 实现高德地图中添加多边围栏,并可编辑,编辑后获得围栏各个点的经纬度

先上一张效果图 看看是不是大家想要的效果&#xff5e; ❤️ 希望其中的小点能帮助大家&#xff0c;主要看怎么绘制在地图上的代码即可 1.第一步要加入项目package.json中或者直接yarn install它都可以 想必大家应该都会 "amap/amap-jsapi-loader": "0.0.7&qu…

Oracle EBS PO采购订单预审批状态处理

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: 采购订单状态:预审批 采购订单流程报错如下: po.plsql.PO_DOCUMENT_ACTION_AUTH.approve:90:archive_po not successful - po.plsql.PO_DOCUMENT_ACTION_PVT.do_action:110:unexpected error in acti…

Unity In App Purchasing内购校验

1&#xff0c;利用收据验证混淆器 把后台的key填进去&#xff0c;点击自动生成一些文件 2&#xff0c;代码过滤 using UnityEngine.Purchasing.Security;在IAPManager.cs的 public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e)增加 #if !UNITY_EDITOR…

Linux—文件内系统与日志分析

目录 一、Linux文件系统 1、inode 与 block概述 1.2、inode内容 1.3、查找inode 1.4、inode故障处理 2、硬盘分区后的结构 3、访问文件的流程 4、文件恢复 4.1、恢复ext3格式文件 4.2、恢复 xfs 格式文件 二、Linux日志文件 1、日志的功能 2、日志的默认位置 3、日…

第一百四十二节 Java数据类型教程 - Java字符数据类型

Java数据类型教程 - Java字符数据类型 Character类的一个对象包装一个char值。 字符类包含isLetter()和isDigit()方法来检查字符是否为字母和数字。 toUpperCase()和toLowerCase()方法将字符转换为大写和小写。 该类提供了一个构造函数和一个工厂valueOf()方法来从char创建对…

高精度定位技术:赋能电网智能化转型的新引擎

在当今社会&#xff0c;电力作为经济发展的血脉&#xff0c;其稳定高效运行对于国家能源安全与社会发展至关重要。随着科技的飞速进步&#xff0c;高精度定位技术正逐步渗透至电网管理的各个环节&#xff0c;成为推动电网智能化转型的关键力量。本文将深入探讨高精度定位技术在…

联合查询(多表查询)

多表查询是对多张表的数据取笛卡尔积&#xff08;关联查询可以对关联表使用别名&#xff09; 数据准备 insert into classes(name, desc) values (计算机系2019级1班, 学习了计算机原理、C和Java语言、数据结构和算法), (中文系2019级3班,学习了中国传统文学), (自动化2019级5…

【java计算机毕设】美容院管理系统 项目源代码MySQL springboot vue html maven+文档 前后端可分离也可不分离

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】美容院管理系统 项目源代码MySQL springboot vue html maven文档 前后端可分离也可不分离 2项目介绍 系统功能&#xff1a; 美容院管理系统包括管理员、用户俩种角色。 管理员功能包括个人中心模块用于修改…

起飞,纯本地实时语音转文字!

简介 偶然在 github 上翻到了这个项目 https://github.com/k2-fsa/sherpa-ncnn 在没有互联网连接的情况下使用带有 ncnn 的下一代 Kaldi 进行实时语音识别。支持 iOS、Android、Raspberry Pi、VisionFive2、LicheePi4A等。 也就是说语音转文字可以不再借助网络服务的接口&am…

为什么技术合作伙伴必须获得 ISO 27001 认证

在当今的数字环境中&#xff0c;强大的安全措施的重要性怎么强调都不为过。 即使是像 Snowflake 这样的巨头&#xff0c;也很少有一天不出现重大漏洞&#xff0c;据《连线》报道&#xff0c;这可能是历史上最大的漏洞之一。 此外&#xff0c;98.3%的组织与至少一家第三方供应商…