这个世界需要秩序——认识排序算法(一)

今天我们来介绍几种常见的排序算法。

现在我们手上有一些杂乱的数据,看看这些排序算法是如何工作的。

选择排序

一句话来概括选择排序算法:从需要排序的数中选出最小的那一个,把它与最左边的数字交换。然后对剩下的数据重复这一步骤即可。在寻找最小值的时候,用的是线性查找。

我们来看如何对上面例子中的数进行排序。

先找到最小值1,然后将它与最左边的3交换。

此时1已经排序完成,找到剩余数的最小值2,将它与左边未排序的第一个值3进行交换

此时1、2都已完成排序。重复上面的步骤,直至排序完成。

我们来看看算法完成所需要的步骤。考虑最极端的情况,第一轮寻找最小值需要n-1步;第二轮需要n-2步;因此一共需要(n-1)+(n-2)+···+2+1=n(n-1)/2=(n^2-n)/2个步骤。

我们的大O表示法仅考虑最高次项,而且忽略常数。所以选择排序的时间复杂度(大O表示法)记为O(n^2)。

冒泡排序

一句话来解释冒泡排序:将数列最右边的数a与左边相邻的数b进行比较,如果a<b,则交换a、b的位置。当最小的数移到最左边时,视为一轮结束。然后在剩下的几轮中重复上面的步骤,直至所有的数据排序完成。

还是使用上面的例子:

找到右边的数字6,与左边相邻的数字7进行比较,6<7,因此交换二者的位置。

然后再将6与其左边的2进行比较,6>2,无需交换二者的位置。接下来,从2开始,将它与左边的位置比较。重复上面的步骤,直至最小值1到达最左边:

此时最小值1到达最左边,第一轮比较就结束了。然后,再从数列的末尾开始,依次与左边进行比较。在几轮过后,最终完成排序。

在冒泡排序中,我们还是考虑最极端的情况。那么第一轮需要n-1步,第二轮需要n-2步,总共需要(n-1)+(n-2)+···+2+1=n(n-1)/2=(n^2-n)/2步,跟选择排序所需的步骤相同。因此,冒泡排序的时间复杂度也可以记为O(n^2)。

插入排序

冒泡排序是从右边开始进行比较,而插入排序是从左边开始比较。插入排序将数列左边第2个数字b与左边第1个数字a比较,如果b<a,则交换a、b的位置。然后从第3个数字开始,重复上面的步骤,直到排序完成。

还是上面的例子:

这里我们假设第一个数字已经排序完成,然后从第二个数字1开始,与左边的3进行比较,1<3,因此交换1和3的位置。

然后看剩余的数字,第3位是9,与左边相邻的数字3进行比较,9>3,因此保留现有位置。重复上述步骤,直至数列按从小到大的顺序完成排列。

回顾整个插入排序算法,我们还是考虑最极端的情况。如果右边的数字比左边的数字都要小,那么它就要一直移动到最左边。因此,第n轮最多需要n-1次比较。那么插入排序的时间复杂度跟之前我们介绍的都一样,都是O(n^2)。

排序算法还有很多,下一篇我们再继续介绍。

(0)

相关推荐

  • Go 数据结构和算法篇(六):选择排序

    今天 以下文章来源于xueyuanjun ,作者xueyuanjun xueyuanjun学院君的订阅号,我会在这里持续更新优质全栈编程技术教程,包括但不限于 Golang.PHP.JavaScrip ...

  • Python排序算法有哪些?分类介绍

    排序是每个软件开发工程师都需要掌握的技能,包含Python工程师也是如此,那么Python排序算法有哪些?常见的排序算法分为插入排序.希尔排序.选择排序.冒泡排序.快速排序等,接下来跟着小编深入了解一 ...

  • Python|分分分找数据

    引言 问题描述 如何从有序数列[2,4,6,12,23,26,33,34,55,57,67,68,77]找到数字6,现在我们站在计算机的角度去思考这道题. 解决方案 第一步:计算机会先找到这组有序数列 ...

  • Python | 深入希尔排序世界

    引言 希尔排序(Shell Sort),是插入排序的一种又称"缩小增量排序",同时它是非稳定排序算法.该方法因 D.L.Shell 于 1959 年提出而得名. 问题描述 希尔排序 ...

  • 你绝对想不到,世界上最奇葩的排序算法!

    然后有水友在评论中留言"是不是下一期要讲睡眠排序了?".楼主才疏学浅,没有听过"睡眠排序",网上搜了一下,眼界大开. 这是一个不但没有工程意义,也不具有分析意义 ...

  • 十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)

    #include<iostream> using  namespace std; void swap1( int *left,  int *right) {      int temp = ...

  • 七大排序算法总结

    以下所有动图均来源于一像素博客园 以下代码均使用C 编写 完整代码请到这里下载 稳定排序算法:冒泡排序.插入排序.归并排序 时间复杂度不受数据影响:选择排序.归并排序.堆排序 时间复杂度基本小于n2: ...

  • 图解七大排序算法

    "排序是计算机的核心内容.事实上,从很多方面看,如果没有排序,计算机就不会变成现实." <算法之美:指导工作与生活的算法> 排序算法,或许是我们日常最常见也是使用频率最 ...

  • Java排序算法(四)希尔排序2

    希尔排序移步法:分组+直接插入排序组合 一.测试类SortTest import java.util.Arrays; public class SortTest { private static fi ...

  • 十大经典排序算法(动图演示)

    0.算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序: ...

  • 关于排序算法,看这一篇就够了!这篇看不懂麻烦找我拿红包

    排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序. 内部排序是数据记录在内存中进行排序. 而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排 ...

  • 十大排序算法详解,基本思想+动画演示+C语言实现,太肝了!

    下面的99%的代码都是手动敲出来的,参考了诸多资料,已经经过测试,可以放心食用. 1.冒泡排序 基本思想 冒泡排序基本思想是依次比较两个相邻的元素,如果顺序(如从大到小.首字母从Z到A)错误就把他们交 ...

  • c语言必会排序算法集(含代码解析)

      一.冒泡排序 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就 ...