浅谈经典排序算法

一、几种经典排序算法的排序过程及时间复杂度

 

冒泡排序:时间复杂度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)的排序。

 

 

 

posted @ 2016-06-02 11:54  谈笑风生~  阅读(387)  评论(0编辑  收藏  举报