数据结构----排序

根据牛客网算法视频以及https://blog.csdn.net/c406495762/article/details/78979946总结。

排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。

排序分为内部排序和外部排序。

若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。

反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。

八大排序算法均属于内部排序。如果按照策略来分类,大致可分为:交换排序、插入排序、选择排序、归并排序和基数排序。如下图所示:


交换排序:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。

插入排序:

选择排序:

下表给出各种排序的基本性能:


一:冒泡排序

平均时间复杂度O(n2),稳定。

(1)交换的范围为0~N-1,第一个数与第二个数进行比较,哪个大,哪个就放在后面;然后第二个数与第三个数进行比较,哪个大,哪个就放在后面,依次交换,最大的数被放在数组的最后位置;

(2)交换的范围为0~N-2,依次交换,第二大的数被放在数组的倒数第二个位置上;

(3)依次进行交换过程,最后范围会从0~N-1变成只剩下一个数,数组就变成有序数组。

二:选择排序

平均时间复杂度O(n2),不稳定。

(1)从0~N-1选择一个最小值,放在位置0上;

(2)从1~N-1选择一个最小值,放在位置1上;

(3)依次从0~N-1到1~N-1到2~N-1,直到最后只包含一个数,数组就变成有序数组。

三:插入排序

平均时间复杂度O(n2),稳定。

(1)位置0上的数与位置1上的数进行比较,如果位置1上的数更小,就跟位置0上的数进行交换;

(2)考查位置2上的数,比较位置2与位置1上的数,如果位置2上的数比位置1上的数小, 继续和位置0上的数进行比较,如果比位置0上的数小,再交换,如果比0位置上的数大,就插在位置0和位置1中间

(3)依次从1位置到N-1位置,都进行这样插入的过程,最后整个数据组就变成有序了。

四:归并排序

平均时间复杂度O(n2),稳定。

(1)让数组中的每一个数单独成为长度为1的有序区间;

(2)把相邻的长度为1 的区间进行合并成最大长度为2 的有序区间;

(3)再把相邻区间进行合并,得到最大长度为4 的有序区间;

(4)直到把数组中所有的数合并成一个有序区间,整个过程结束。

五:快速排序

平均时间复杂度O(n2),不稳定。

随机地从数组中选择一个数(也可以选取数组的第一个元素),将小于等于它的数,放在它的左边,大于它的数,放在它的右边;

左右两边分别递归调用快速排序的过程,最后使得整个数组变成有序数组。

划分过程:时间是复杂度O(n);

(1)首先随机选择一个划分值,和数组的最后一个值进行交换;

(2)设置一个小于等于区间,初始长度为0,放在数组的最左边;

(3)接下来,从左往右遍历所有的元素,如果当前元素大于划分值,继续遍历下一个元素;如果当前元素小于划分值,则将其与小于等于区间的下一个元素进行交换,然后小于等于区间向右括一个位置;

(4)在遍历完所有的元素,直到最后一个数的时候,将最后一个数也就是划分值与小于等于区间的下一个元素进行交换,这样就完成一次划分。

六:堆排序

平均时间复杂度O(n2),不稳定。

(1)首先。将数组中的N个数建成一个大小为N的大根堆或小根堆,本次排序以大根堆为例,堆顶为最大值;

(2)将堆顶元素与堆的最后一个位置上的数进行交换,将最大值脱离整个堆结构,放在数组的最后位置,最为数组的有序部分存下来;

(3)接下来把N-1大小的堆,从堆顶位置开始进行大根堆的调整;

(4)接着再把堆顶元素与整个堆的最后一个位置上的数进行交换,同样作为数组的有序部分,堆的大小变成 N-2;

(5)继续从堆顶位置开始进行大根堆的调整,。。。。,这样堆的大小依次-1,数组的有序部分依次增加;

(6)当堆的大小为1,整个数组变成有序。

七:希尔排序(插入排序的一个改进)(关键在于步长的选择):

插入排序的步长为1,希尔排序的步长是逐渐调整的(从大到小调整)。

(1)6 5 3 1 8 7 2 4,初始步长为3;

(2) 6 5 3作为前三个数, 不需要调整,从1开始,1向前跳三位,与6进行比较,1<6,与6进行交换,再往前跳就越界了,停止;1 5 3 6 8 7 2 4

(3)处理8,与5进行比较,8>5, 停止交换;1 5 3 6 8 7 2 4

(4)处理7,与3进行比较,7>3,停止交换;1 5 3 6 8 7 2 4

(5)处理2,与6进行比较,2<6, 与6进行交换,2再向前跳三位,与1进行比较,2>1,停止交换;1 5 3 2 8 7 6 4

(6)处理4,与8进行比较,4<8,与8进行交换,4再向前跳三位,与5进行比较,4 <5,1 5 3 2 4 7 6 8,1 4 3 2 5 7 6 8,再向前跳越界;

(7)步长为3调整结束,进行步长为2,步长1的调整。

八:计数排序(不是基于比较的排序,思想来自于桶排序)

九:基数排序(不是基于比较的排序,思想来自于桶排序)

平均时间复杂度O(n),稳定。

(1)按照个位上的数进桶,再倒出;

(2)按照十位上的数进桶,再倒出;

(3)按照百位上的数进桶,再倒出;

猜你喜欢

转载自blog.csdn.net/zhourunan123/article/details/79617273