随着人口城镇化的进程,城市人口的慢慢增加,对于一些生活在一二线城市的同学来说,排队已然成为生活中的基操:上公交排队、打车排队、坐地铁排队、点餐排队、喝奶茶排队、办证排队、下课ATM取钱排队……说到排队,猪哥想起有次去银行办事的我……
排队我们可以理解为是根据时间(先来后到的)做的一种排序,使元素从无序到有序的方法,我们称为:排序算法。
程序世界往往和现实世界有很多相似之处,所以排序的问题在工作中也常常会遇到,比如商品根据不同条件排序、搜索相关性排序、以及一些根据时间或以某种规则的排序等等;而且在面试和算法比赛中排序也是必不可少的一个考点,比如手写一个快排、如何处理亿级数据排序以及复杂度等问题;
排序算法对程序员来说可以说是一项基本功,其重要性是不言而喻的。本期猪哥带大家来了解下常见的排序算法,而本文会作为开胃菜为大家简单介绍一些排序算法的相关概念,下次会为大家详细讲解每种排序的Python代码实现及图解!
一、排序定义
既然排序如此重要那何为排序呢?看看百科对排序的定义:
排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。 ——百度百科
猪哥的理解是:简单来说就是将一组无序的数据通过某种算法然后使它们按某种规则有序的排列,这就是排序的定义。
二、相关概念
排序算法是一种算法,而算法是与语言无关的,你可以用Python实现,也可以用Java、C、Js等任何语言实现,下面来一起了解排序算法相关的一些概念 。
1.比较排序和非比较排序
我们将排序的时候元素之间是否需要比较分为:比较排序和非比较排序,下面简单理解一下这两个概念:
a)比较排序:
顾名思义就是需要通过元素之间比较之后再决定先后顺序。如下冒泡排序的图,每次都是选取两个元素(绿色)进行比较:
现实生活中这种比较排序的例子很多,比如中学按成绩排名或高矮顺序来安排座位;
b)非比较排序:
非比较排序就是不需要通过元素之间的比较就可以确定每个元素的位置,如下是基数排序的动图,排序时每个元素并不需要比较,而是有自己固定的位置:
现实生活中非比较排序的例子如大学坐位置;
2.稳定和不稳定
我们排队的时候,当出现两个人同时抢占一个位置的情况,不免会发生一些口角;而在排序算法中也会遇到两元素相同的情况,这时候怎么办呢?
假设我们有这样一组数据[7,5,2,5],然后我们来看看稳定排序算法和不稳定排序算法得出的结果:
a)稳定:
如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
b)不稳定:
如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
3.算法复杂度
算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。
a)时间复杂度:
时间复杂度(Time Complexity)是描述运行算法所花费的时间量的计算复杂度,记做O(f(n))。
n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但是它的变化是有规律的,所以引入时间复杂度这个概念。一般情况下,算法中的基本操作重复次数的是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
b)空间复杂度:
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。
c)复杂度
上面给大家讲了时间复杂度和空间复杂度,下面看看常见的几种复杂度:
复杂度表示图:
三、总结
本文为大家介绍了排序算法的三个相关知识点:
比较排序和非比较排序
稳定和不稳定
算法复杂度
下次会为大家详细讲解每种排序的Python代码实现及图解!
参考:
https://dwz.cn/FsEBEVK6、https://dwz.cn/8hoIwpxo
【完】
裸睡的猪(ID:IT--Pig)
作者:猪哥-Pythoner,禁止未授权转载,授权请私聊