经典排序算法简单总结

01.冒泡排序:
   思路:最开始交换区间是0~N-1,从第一个数开始,每个数和它后一个数比较,若大于则交换,然后下一个数再和后一个数比较,以此类推,最大的数就在数组的末尾,然后交换区间变成0~N-2;

   时间复杂度: O(n^2)


02.选择排序:
   思路:最开始交换区间是0~N-1,当前元素和其后面的所有元素比较,选出最小值,放到当前的位置;然后下标后移,再选出当前最小值,放到当前位置;以此类推。
   时间复杂度: O(n^2)


03.插入排序:

   思路:遍历数组,从第一个元素开始,找到当前元素之前的序列中第一个大于当前元素的位置[因为构造的这个序列是有序的],从该位置开始到当前位置-1,向后移一个位置[把当前元素覆盖];把当前元素插入到第一个大于当前元素的位置,然后处理下一个元素。
   时间复杂度: O(n^2)


04.归并排序:

   思路:先让数组中的每个元素成为长度为1的有序区间,然后把相邻的长度为1的有序区间进行合并,形成最大长度为2的有序区间,以此类推,直到数组中的元素成为一个有序区间为止。【先拆分,后合并】
   时间复杂度: O(n*logn)


05.快速排序:

   思路:从待排序列中取任一数据(如第一个数据)作为分界值,所有比它小的元素一律放到左边,比它大的元素一律放到右边。这样经过一趟下来形成两个序列,左边序列元素的值都比分界值小,右边序列元素的值都比分界值大,对左右两个序列也进行同样操作,使得数组有序。一次排序的时间复杂度为O(N)

快速排序一个潜在的缺点在于它是一种不稳定的排序算法,考虑对一个已经有序的数组进行快速排序,会发现每次切分点都在数组的边缘,这时算法的效率将退化到 O(n2) 级别。为了规避这个缺陷,在实际应用中,在进行快速排序之前需要对被排序数组进行随机乱序处理。

   时间复杂度: O(n*logn)


06.堆排序:

   思路:首先把数组中的元素建成一个大小为n的大顶堆,堆顶是数组元素的最大值,把堆顶和堆的最后一个元素交换,把最大值存在数组最后的位置,脱离堆结构,作为数组的有序部分。接下来把大小为n-1的堆进行大顶堆的调整,重复之前的操作。
   时间复杂度: O(n*logn)


07.希尔排序:

   思路:插入排序改良算法,插入排序步长是1,插入时每一次和前面的一个数比较;而希尔排序的步长是不断调整的,但是都会以步长为1作为结束。所以希尔排序的关键是步长的选择,步长选择越优,时间复杂度越低。
   时间复杂度: O(n*logn)


08.基于桶排序思想:不是基于比较的算法

   计数排序
   基数排序
   时间复杂度:O(n)


经典排序算法的空间复杂度:

O(1):冒泡排序、选择排序、插入排序、希尔排序、堆排序
O(logn)~O(n):快速排序
O(n):归并排序
O(m):桶排序


排序算法的稳定性:待排序列中,相同的元素相对位置是否改变。

稳定的排序算法:冒泡排序、插入排序、归并排序、基数排序、计数排序、桶排序
不稳定的排序算法:选择排序、快速排序、希尔排序、堆排序


排序算法无优劣,选择和待排元素有关。
快速排序并不比堆排序和插入排序优良,只是常量系数比较小。
工程上的排序是综合排序,当数组较小时选择插入排序,数组较大选择快速排序或其他O(n*logn)的排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值