码迷,mamicode.com
首页 > 编程语言 > 详细

经典排序算法的零基础通俗讲解

时间:2016-06-02 13:16:21      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

 

本贴是对左程云老师排序算法讲解的学习整理,该整理为本人原创不得以任何形式转载。

 

 

经典排序算法的零基础通俗讲解

标签:

原文地址:http://www.cnblogs.com/CZDblog/p/5551154.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!