浅谈经典排序算法
一、几种经典排序算法的排序过程及时间复杂度
冒泡排序:时间复杂度O(n²)
数组中的第一个元素和第二个元素比较,大的放在后边,然后第二个元素再和第三个元素比较,大的放在后面。以此类推。
选择排序:时间复杂度O(n²):
0到n-1里找最小值放位置0上;1到n-1里找最小值放位置1上 以此类推。
插入排序:时间复杂度O(n²)
一个数和他前边的数比较,如果大于那个数就放在那个数后面,如果比那个数小就一直往前比较,直到比某个数大就放在那个数后面。如果都没有就放在首位置。
时间复杂度:O(N*logN) : 归并排序,快速排序,堆排序,希尔排序。
归并排序:4 6 8 1 7 3 5 2 先每个数自己一组
然后相邻的成为一组: 46 81 73 52 组里边排序 46 18 37 25
然后相邻的组成为一组: 4618 3725 组里边排序 1468 2357
然后再相邻的成为一组:14682357 组里边排序 12345678
快速排序:
随机选中一个数,小于等于它的数放在这个数的左边,大于它的数放在这个数的右边
接下来对左右两个部分分别的递归的调用快速排序
堆排序:
把数组中n个元素建立成大小为n的大根堆,堆顶是整个所有元素的最大值,把堆顶的元素和堆的最后一个位置的元素位置进行交换。然后把最大值脱离出整个堆结构放在数组的最后位置。作为有序部分。
再把n-1大小的堆进行大根堆的调整,堆顶还是最大元素,再和最后一位数交换,然后脱离。
脱离出的数就是有序的 最大值们
希尔排序:
插入排序改良的排序(插入排序步长为1)。希尔排序的步长是从大到小逐渐调整的。
比如步长为3,那么一个数就和他前面第三个数比较,比他大不动,比他小就继续再和他前面第三个数比较(如果有的话),直到比某个数大留在当前位置为止。
然后改变步长再比较。最终都会以步长为1的情况结束。
希尔排序的成败完全取决于步长的选择,步长选择越优时间复杂度越低,步长选择越劣越趋近于O(n²).
时间复杂度趋于O(N):都不是基于比较的排序算法(思想原型都来自桶排序)。
缺陷:区间太大的话,准备太多桶,造成大量空间浪费。
计数排序:
比如排序几个人的身高:先设置100厘米到300厘米的桶(100,101,102......300)。
然后把相应身高的人放进桶里。然后从100号桶依次倒出元素。员工被倒出的顺序就是身高的顺序。
基数排序:
比如排序几个数:设置0到9号桶。
先按照个位上的数放入相应桶中,再从0号桶到9号桶依次倒出所有的数。
再按十位放入;再按百位放入........
最后倒出来的数就有序了。
二、其他补充
空间复杂度:
O(1):插入排序,选择排序,冒泡排序,堆排序,希尔排序。
O(logN)~O(N):快速排序。
O(N):归并排序。
O(M):计数排序,基数排序。(M是选择桶的数量)
稳定性:相同值的元素 在经过排序后相对次序保持不变。
稳定的排序算法:
冒泡排序,插入排序,归并排序,计数排序,基数排序,桶排序。
不稳定的排序算法:
选择排序,快速排序,希尔排序,堆排序。
工程上的排序:
1.工程上的排序是综合排序。
2.数组较小时,使用插入排序。
3.数组较大时,使用快速排序或其他O(N*logN)的排序。