目录

马桶排序(令人作呕的排序)

冒泡排序(面试都要问的算法)

快速排序(见证亚当和夏娃的爱情之旅)

马桶排序(令人作呕的排序)

一、场景:期末考试完了,老师要将同学们的分数从高到低排序。假设班上有 5 名同学,分别考了 5 分、3 分、5 分、2 分和 8 分【满分:10 分】,排序后的结果就是 8 5 5 3 2,现在,让我们先思考 10 分钟吧!

二、思路:

(1)先创建一个数组 int scores[11],就有 scores[0]~scores[10] 共 11 个变量。我们用变量值为 0 表示没有人得到该分数,即 scores [0]=0 表示没有人得 0 分,scores [10]=0 表示没有人得 10 分,而 scores [8]=1 表示有一个人得到 8 分。

(2)第 1 个数为 5,所以在 scores[5]=0 的基础上+1,即 scores[5]=1 表示有 1 人得到 5 分

(3)第 2 个数为 3,所以在 scores[3]=0 的基础上+1,即 scores[3]=1 表示有 1 人得到 3 分

(4)第 3 个数为 5,所以在 scores[5]=1 的基础上+1,即 scores[5]=2 表示有 2 人得到 5 分

... ...

(5)依此类推,处理第 4 和第 5 个数,最终的结果图如下:

(6)我们发现,scores[0]~scores[10] 内对应的值就是 0~10 分中每个分数所出现的次数。现在,只需将结果打印即可,出现几次就打印机次。

我们暂且称它为“马桶排序”,这个算法就相当于有 11 个马桶,编号从 0~10。每出现一个数,就在对应编号的马桶中放一个旗子。

图:这里有 11 个马桶

三、思考:现在分别有 5 个人的名字和分数:小A 5、小二 3、小三 5、小妞 2 和王大锤 8,请按照分数从高到低,输出他们的名字?

【特点】

假设需要排序的范围 0~20000000,则需要 new int[20000001],非常浪费空间,即便只给 2 个数排序(1,19999999 );

如果排序的数是小数也不行,如:3.141 5926 5358 9793 2384 6264 3383 2795 0238;

这里使用 C# 给出简单的算法过程。

1 static void Main(string[] args)

2 {

3 var scores = new int[] { 5, 3, 5, 2, 8};

4 var newScores = new int[9];

5

6 for (int i = 0; i < scores.Length; i++)

7 {

8 var score =scores[i];

9 newScores[score]++;

10 }

11

12 for (int i = newScores.Length - 1; i >= 0; i--)

13 {

14 var num =newScores[i];

15 for (int j = 1; j <= num; j++)

16 {

17 Console.Write($"{i} ");

18 }

19 }

20

21 Console.WriteLine();

22 Console.Read();

23 }

24 }

冒泡排序(面试都要问的算法)

一、基本思想:每次比较相邻的两个 元素,按需调整顺序

二、题目:要求将 12 35 99 18 76 这 5 个数进行从大到小排序

三、思路:

(1)先比较第 1 位和第 2 位的大小,12<35,因为希望越小越靠后,所以要调整两者顺序,交换后的结果:35 12 99 18 76

(2)现在比较第 2 位和第 3 位的大小,12<99,所以需要交换位置,交换后的结果为:35 99 12 18 76

(3)接着比较第 3 位和第 4 位的大小,12<18,交换后的结果为:35 99 18 12 76

(4)最后比较第 4 位和第 5 位的大小,12<76,交换后的结果为:35 99 18 76 12

(5)经过 4 次后我们发现 5 个数中最小的一个数已经就位,每将一个数归位我们称其为“一趟”;

(6)现在我们开始第二趟,目标将第 2 小的数归位,根据之前逻辑,还是从第 1 个数和第 2 个数开始比较上:

35 99 18 76 12 --①--> 99 35 18 76 12 --②--> 99 35 18 76 12 --③--> 99 35 76 18 12

在第一趟比较就知道第 5 位是最小的,所以第 4 位不用和第 5 位比较,这一趟只需比较 3 次

(7)第3趟:99 35 76 18 12 --> 99 35 76 18 12 --> 99 76 35 18 12 (比较 2 次)

(8)第4趟:99 76 35 18 12 --> 99 76 35 18 12 ,有4个数已经就位,那么最后一个数无须比较,它就是最大的

【总结】如果有 n 个数进行排序,只需将 n-1 个数归位,即要进行 n-1 趟操作,而每一趟开始都从第 1 位进行相邻的两个数 进行比较,将小的那个数放在后面,已经归位的就不用进行比较。

【特点】冒泡算法的核心部分是双重嵌套循环,可以看出时间复杂度是 O(N²),这是一个非常高的时间复杂度。

这里使用 C# 给出简单的算法过程。

1 static void Main(string[] args)

2 {

3 var nums = new int[] { 12, 35, 99, 18, 76};

4 Output(nums);

5

6 for (int j = 0; j < nums.Length - 1; j++)

7 {

8 for (int i = 0; i < nums.Length - 1; i++)

9 {

10 if (nums[i] < nums[i + 1])

11 {

12 var temp =nums[i];

13 nums[i] = nums[i + 1];

14 nums[i + 1] =temp;

15 }

16 }

17

18 Output(nums);

19 }

20

21 Console.Read();

22 }

23

24 ///

25 ///控制台输出

26 ///

27 ///

28 static void Output(int[] nums)

29 {

30 foreach (var num innums)

31 {

32 Console.Write($"{num} ");

33 }

34

35 Console.WriteLine();

36 }

快速排序(见证亚当和夏娃的爱情之旅)

一、场景:对 6 1 2 7 9 3 4 5 10 8 这 10 个数进行排序

二、思路:

先找一个基准数(一个用来参照的数),为了方便,我们选最左边的 6,希望将 >6 的放到 6 的右边,<6 的放到 6 左边。如:3 1 2 5 4 6 9 7 10 8

先假设需要将 6 挪到的位置为 k,k 左边的数 <6,右边的数 >6

(1)我们先从初始数列“6 1 2 7 9 3 4 5 10 8 ”的两端开始“探测 ”,先从右边往左找一个 <6 的数,再从左往右找一个 >6 的数,然后交换。我们用变量 i 和变量 j 指向序列的最左边和最右边。刚开始时最左边 i=0 指向 6,最右边 j=9 指向 8

图:亚当 i 和夏娃 j

(2)现在设置的基准数是最左边的数,所以序列先右往左移动(j--),当找到一个 <6 的数(5)就停下来。接着序列从左往右移动(i++),直到找到一个 >6 的数又停下来(7);

(3)两者交换,结果:6 1 2 5 9 3 4 7 10 8;

(4)j 的位置继续向左移动(友情提示:每次都必须先从 j 的位置出发),发现 4 满足要求,接着 i++ 发现 9 满足要求,交换后的结果:6 1 2 5 4 3 9 7 10 8;

(5)目前 j 指向的值为 9,i 指向的值为 4,j-- 发现 3 符合要求,接着 i++ 发现 i=j,说明这一轮移动结束啦。现在将基准数 6 和 3 进行交换,结果:3 1 2 5 4 6 9 7 10 8;现在 6 左边的数都是 <6 的,而右边的数都是 >6 的,但游戏还没结束

图:亚当和夏娃终于产生了交集

(6)我们将 6 左边的数拿出来先:3 1 2 5 4,这次以 3 为基准数进行调整,使得 3 左边的数 <3,右边的数 >3,根据之前的模拟,这次的结果:2 1 3 5 4

(7)再将 2 1 抠出来重新整理,得到的结果: 1 2

(8)剩下右边的序列:9 7 10 8 也是这样来搞,最终的结果: 1 2 3 4 5 6 7 8 9 10 (具体看下图)

【总结】快速排序的每一轮处理其实就是将这一轮的基准数归位,当所有的基准数归位,排序就结束啦

c语言快速排序算法马桶,学习算法 -- 马桶排序、冒泡排序和快速排序相关推荐

  1. 常用排序:冒泡排序与快速排序详解,看完这篇就够了!风马博客

    常用排序:冒泡排序与快速排序详解. 在排序算法中,冒泡排序和快速排序可以算是排序算法入门必会的两种排序了,今天和大家来分析一下如何快速理解并掌握这两种排序.首先冒泡排序是初学者最常用的排序,所以我们先 ...

  2. r语言c50算法的过程,【机器学习与R语言】5-规则学习算法

    1.分类规则原理 if-else逻辑:前件由特征值的特定组合构成,在满足规则的条件下,后件描述用来指定的分类值. 决策树必须从上至下应用,而规则是单独存在的事实.通常比决策树更简洁.直接和理解. 规则 ...

  3. 漫画算法小灰学习算法笔记

    写在前面的话: 学习算法,需要做的是领悟算法思想.理解算法对内存空间和性能的 影响,以及开动脑筋去寻求解决问题的最佳方案. 正文如下: 第1章 算法概述 1.1.2 什么是算法 算出1+2+3+4+5 ...

  4. 【算法之家】——交换排序之冒泡排序与快速排序

    [前言] 冒泡排序和快速排序属于交换排序,快速排序是冒泡排序的一种改进算法.我更觉得快速排序更像是一种特殊的二分查找,从两头开始查找,用法更加的巧妙! [内容] 冒泡排序的基本过程用如下的动态图表示: ...

  5. java排序:冒泡排序和快速排序

    /**      * Purpose:冒泡      * @author Hermanwang      * @param a:需要排序的数组      * @return void      */ ...

  6. 【算法】学习笔记(5):快速排序

    注意一个C++的坑 sizeof() 这个函数静态数组可以求长度,动态new出来的数组不行,因为针对的是指针--,不过既然的动态数组了,其长度本身必然是一个变量了,你没有必要这么求长度. 下面看快速排 ...

  7. android 绘制歌词算法,深度学习算法写歌词

    AI开发平台ModelArts ModelArts是面向开发者的一站式AI开发平台,为机器学习与深度学习提供海量数据预处理及半自动化标注.大规模分布式Training.自动化模型生成,及端-边-云模型 ...

  8. 一天一个小算法的学习之选择排序

    选择排序: 其思想就是,将每个数据元素,分成有序数列和无序数列..在每次排序中找出最小的那一个数据元素并放到有序数列后面,一直到排序结束.. using System;namespace SortPr ...

  9. 选择排序-冒泡排序-归并排序-快速排序-插入排序

    选择排序 基本思想: 设所排序序列个数为N,i取1,2,3-n-1,从N-i+1个记录(Ri,Ri+1-.Rn)中找出排序码最小的记录,与第i个记录交换,执行N-1次后完成序列的排序. //选择排序 ...

最新文章

  1. 如何设置chrome谷歌浏览器不显示图片
  2. 双11背后基础设施软硬 结合实践创新
  3. OTA常见方案分析(差分升级 全量升级 AB面升级 Recovery系统升级)
  4. Android 使用ORMLite 操作数据库
  5. war 发布后页面不更新_吐槽 | 都发布一万年了,这游戏还不“更新”?
  6. 围棋提子后的子放哪_围棋入门知识点:围棋规则 —— 禁入点
  7. 堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出_漏洞公告 | 华硕(ASUS)家庭无线路由器远程代码执行0day...
  8. 【数学建模】长方形椅子在不平地面上能否放稳
  9. CentOS8 同步时间chrony ntpdate已无法使用
  10. 昆仑通态如何连接sqlserver数据库_三菱FX5U 与昆仑通态触摸屏的连接操作步骤
  11. 快速学会普源示波器的调节和使用
  12. 如何找到外文文献对应的中文文献?
  13. 游戏HTML翻翻乐,大班益智游戏翻翻乐教案
  14. 如果牛顿是程序员,那么?
  15. Multiple View Geometry(多视图几何)学习笔记(23)—射影摄像机对二次曲面的作用摄像机中心的重要性
  16. (DFS)深度优先搜索算法详解
  17. 美团 SP 30K*15.5?如何看待老生常谈的薪资倒挂现象?
  18. 电子信息工程求职目标_实用的信息工程专业求职信四篇
  19. 如何将修改Tomcat的默认端口(8080)到80端口
  20. PS 2018CC安装完打开后,菜单界面的字体太大太小如何调整

热门文章

  1. j和jk是有区别的_JK制服和水手服有什么区别?
  2. mysql数据库replace写入_mysql 操作总结 INSERT和REPLACE
  3. 三种搭建网站的方法(基于域名,IP,端口)
  4. iOS 直播技术文档
  5. ”plt.savefig 保存图片时一片空白“问题的另一个原因
  6. Archlinux安装屏保墙纸软件(livewallpaper)
  7. 有符号数与无符号数比较大小
  8. [极简]路由器发送IP至服务器
  9. 发现一张三年前飔拓科技的笔试题,清一色的数据结构和算法。
  10. 如何在百度推广里加入两个密保手机