当我们面临一堆数据时,我们就会想到如何对数据进行规范化的处理。首先肯定要将数据进行排序,一堆杂乱无章的数据肯定是不利于进行数据操作的,那么只有将数据进行科学、适当地进行排序,才能使数据在后续操作中更加快捷、方便和高效。
PS:本主题报告只在于告诉小白如何懂得算法排序与查询的简单原理,对于具体实现不加以过多的赘述。
接下来我将简单介绍八大排序算法
1.插入排序:简单插入排序、希尔排序
2.交换排序:冒泡排序、快速排序
3.选择排序:简单选择排序、堆排序
4.归并排序
5.基数排序
一、插入排序之简单插入排序
简单插入排序在往期的博客中本人介绍过,类似于大家斗地主,将混乱的手牌大到小或小到大理清楚。
基本原理:插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
二、希尔排序
希尔排序可以认为是一种升级版的快速排序。它引入了一个增量的概念。在简单插入排序中发现我们有些数据是不用进行扫描。因为每次进行简单插入排序时,都要从后往前进行扫描,这必然时间复杂度就会变大。
希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。
它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。
那么希尔排序就是为了减少时间复杂度,具体如何操作呢请看如下:
我们选择增量 gap=length/2,缩小增量以 gap = gap/2 的方式,用序列 {n/2,(n/2)/2...1} 来表示。
三、交换排序之冒泡排序
冒泡排序顾名思义就跟它的名字一样,就像吐泡泡一样,从大到小,一个一个往上冒。
算法步骤:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
PS:如果从头到尾的数据都没有进行交换,那么可以认为这个数据是有序的
四、交换排序之快速排序
快速排序是冒泡排序的分而治之加递归的版本。它的排序速度是在所有排序中最快的。
快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。——《算法艺术与信息学竞赛》
那具体是如何实现的呢?
算法步骤:
-
从数列中挑出一个元素,称为 "基准"(pivot);(一般选最左边的为基准元素)
-
重新排序数列