01.冒泡排序:
思路:最开始交换区间是0~N-1,从第一个数开始,每个数和它后一个数比较,若大于则交换,然后下一个数再和后一个数比较,以此类推,最大的数就在数组的末尾,然后交换区间变成0~N-2;
思路:最开始交换区间是0~N-1,当前元素和其后面的所有元素比较,选出最小值,放到当前的位置;然后下标后移,再选出当前最小值,放到当前位置;以此类推。
时间复杂度: O(n^2)
时间复杂度: O(n^2)
时间复杂度: O(n*logn)
时间复杂度: O(n*logn)
时间复杂度: O(n*logn)
基数排序
时间复杂度:O(n)
O(logn)~O(n):快速排序
O(n):归并排序
O(m):桶排序
不稳定的排序算法:选择排序、快速排序、希尔排序、堆排序
排序算法无优劣,选择和待排元素有关。
快速排序并不比堆排序和插入排序优良,只是常量系数比较小。
工程上的排序是综合排序,当数组较小时选择插入排序,数组较大选择快速排序或其他O(n*logn)的排序。
思路:最开始交换区间是0~N-1,从第一个数开始,每个数和它后一个数比较,若大于则交换,然后下一个数再和后一个数比较,以此类推,最大的数就在数组的末尾,然后交换区间变成0~N-2;
时间复杂度: O(n^2)
思路:最开始交换区间是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)的排序。