常用排序算法总结

1.插入排序 平均时间复杂度O(n2)

每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。

常用排序算法总结_第1张图片


2.希尔排序 平均时间复杂度O(nlogn)~O(n2)

基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行(直接插入,冒泡)排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次排序。

常用排序算法总结_第2张图片


3.冒泡排序 平均时间复杂度O(n2)

相邻两个数比较,依次交换。

常用排序算法总结_第3张图片


4.快速排序 平均时间复杂度O(nlogn)

找出一个元素(平时常用作为基准的就是第一个,最后一个,中间)作为基准, 然后对数组进行分区操作,使基准左边元素的值都不大于基准值, 基准右边的元素值都不小于基准值,然后递归快速排序。

常用排序算法总结_第4张图片


5.选择排序 平均时间复杂度O(n2)

每一次从未排好序的元素中选择一个值最小(最大)的元素,然后将其与未排好序元素的第一个(最后一个)元素交换位置。

常用排序算法总结_第5张图片


6.堆排序 平均时间复杂度O(nlogn)

利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,每次从无序中选择最大元素(最小元素)。

基本思想为(大顶堆):

1)将初始待排序关键字序列(R1, R2....Rn)构建成大顶堆,此堆为初始的无序区;

2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1, R2, ......Rn - 1)和新的有序区(Rn), 且满足R[1, 2...n - 1] <= R[n];

3)由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1, R2, ......Rn - 1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1, R2....Rn - 2)和新的有序区(Rn - 1, Rn)。

不断重复此过程直到有序区的元素个数为n - 1,则整个排序过程完成。

完整的堆排序具体过程如下:

1)将待排序的元素构造成一个堆;

2)输出堆顶元素;

3)将堆中最后一个元素移至堆顶,并调整剩余的堆。

常用排序算法总结_第6张图片

常用排序算法总结_第7张图片


7.归并排序 平均时间复杂度O(nlogn)

基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

常用排序算法总结_第8张图片

常用排序算法总结_第9张图片


8.计数排序

类似于桶排序的排序算法,其优势是对已知数量范围的数组进行排序。初始化一个计数数组,大小是输入数组的范围。遍历输入数组,遇到一个数就在计数数组对应的位置上加一。把计数数组直接覆盖到输出数组(节约空间)。

常用排序算法总结_第10张图片

你可能感兴趣的:(c++,算法)