各种排序算法

稳定的

  1,冒泡排序(bubble sort) — O(n^2)

    每次扫描的时候,看看第k位是不是比k-1的小,如果小,就调换位置,循环n次,算法复杂度是O(n2)

  2,鸡尾酒排序(Cocktail sort, 双向的冒泡排序) — O(n^2),

    有时降序冒泡,有时升序冒泡

  3,插入排序(insertion sort)— O(n^2)

    从头开始扫描,已经扫描的就是排好序的,未扫描的就是未排序的,总共扫描n次,每次插入的时候移动n次,时间复杂度O(n2)

  4,桶排序(bucket sort)— O(n); 需要 O(k) 额外空间

    将数的范围1-m分成k等分,然后把n个数分到这个k等分中,然后再对每个等分的数排序,最后合并这k等分

  5,合并排序(merge sort)— O(nlog n); 需要 O(n) 额外空间

    对排序的数两两排序,然后再四个四个排序,然后再八个八个排序....算法复杂度是O(nlog(n))

不稳定的

  1,选择排序(selection sort)— O(n^2)

    扫描n次,从中选择最小的,挑出来,总共循环n次,算法复杂度也是O(n2)

    这种排序方法可能一看认为是稳定的,想一个反例:5 8 5 2 9,从小到大排序,我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法

  2,希尔排序(shell sort)— O(nlog n) 如果使用最佳的现在版本

    维护一个类似增量的变量k,一开始k是大于n/2的最小整数,将i和i+k元素比较,这里需要注意的是,如果第i和i+k位置互换之后,还需要比较i位置上的新数和i-k位置上的需不需要互换,扫描完之后,k变为k/2,然后重新扫描,算法复杂度

  3,堆排序(heapsort)— O(nlog n)

    构建初始堆:每次调整都是从父节点、左孩子节点、右孩子节点三者中选择最大者跟父节点进行交换(交换之后可能造成被交换的孩子节点不满足堆的性质,因此每次交换之后要重新对被交换的孩子节点进行调整

    然后不停从堆顶得到最大最小值就可以了

  4,快速排序(quicksort)— O(nlog n) 期望时间, O(n^2) 最坏情况; 对于大的、乱数列表一般相信是最快的已知排序

转载于:https://www.cnblogs.com/zhongwh/archive/2012/03/16/2399936.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值