时间很快,今天已经是2018年10月份的最后一天了,那么我们今天这篇博文介绍的则是算法中一些经典的排序算法。有兴趣的朋友,可以来观望观望,求围观。
好,下面我们开始正题部分。
第五章 排序算法
因为计算机可以进行高速的计算处理,所以非常擅长对大量数据按照一定的规则正确排序处理。
5.1 排列数据
排序是指对多个数据排序的顺序。
排序:按照某种事物的属性数据,为多个事务整理顺序的处理叫做排序。
排序的顺序:
升序:从小到大的顺序
降序:从大到小的顺序
5.2 排序算法
介绍几种经典的排序算法
1.桶排序
准备与待排序数组取数范围相同大小个数的木桶,利用这些木桶对数据进行保存排序。
2.选择排序
遍历数据,把数据中的最大值(或者最小值)与起始(或者末尾)数据进行交换
3.交换排序(冒泡排序)
对比相邻的两个数据,根据大小关系调整两个数据的顺序。
4.插入排序
把目标数据按照正确的大小顺序插入到相应的位置中。
5.希尔排序
把目标数据按照一定的个数分成几个区域 进行插入排序
6.归并排序
把目标数据分割成更小的部分进行排序,更小的部分正确排序之后再合并起来
7.快速排序
从目标数据中任意选取一个数据,以这个数据的值为分割点,把目标数据分割为两个部分。这样循环操作下去进行排序。
5.3 桶排序
最简单的排序算法之一。
首先需要准备“待排序数据”的“取值范围的个数”的木桶数组。这样,每个待排序数据都对应一个木桶的标号(数组下标)。我们从木桶的起始元素开始进行顺序处理,如果木桶下标对应一个待排序的数据,把这个数据按照出现次数取出来,就是排列好的数据了。
具体过程如下:
适用于数据取值范围较小的场合。
5.4 选择排序
每次找出一个最小(最大)值的排序算法
最容易理解的算法之一。
现实的场景如下:
思路如下:
准备保存一个排序数据的数组,把这个数组分成“已排序的部分”和“待排序的部分”,一开始前者是空的,后者是整个数组。
算法实例过程如下:
5.5 冒泡排序
进行相邻数据的交换的算法
核心就是比较相邻的两个元素的大小关系。
数据分成待排序部分和已排序部分组成,在开始之前,前者为空,待排序部分则是整个数组。
具体步骤如下:
算法演示过程如下:
5.6 插入排序
向有序数据里的正确位置插入数据的算法。
假设数据列D,前i-1个数据是已排序部分,那么把第i个数据按照大小关系插入到已排序的数据列中,依次完成排序的过程称为插入排序。
具体过程如下:
算法演示过程如下:
5.7 归并
就是把“几个已排序的数列”合并成“一个已排序的数列”的算法。
演示过程如下:
5.8 归并算法
利用归并进行排序的算法称为归并排序,先分割再合并。
步骤1:把数据列分割成两个部分。
把待排序的数据列平均分成两个数据列,把得到的数据列也平均分为两个数据列......不断地重复下去,直到分割后得到的数据列只剩下一个元素。
步骤2:对分割后的数据列进行归并。
把分割后得到的数据列不断地和相邻的数据进行归并,直到最终归并得到一个数据列
具体过程如下:
算法演示过程如下:
5.9 希尔排序
改进排序效率
分组进行排序
把数据按照一定的间隔分割成不同的组,并且对每个组进行排序。
虽然算法稍微复杂,但是数值的交换处理更少,执行速度更快。
具体过程如下:
算法演示过程如下:
5.10 快速排序
最快的排序算法(言语有待于优化)
只需要最少的时间完成
思路:
在快速排序中,首先我们从数据列中,任意选取一个数据P(基准数),接着我们把比P小的值和比P大的值分离出来,得到新的数据列。这样一来P在最终排列好的数据列中的位置就确定了。
算法演示过程如下: