稳定的

  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) 最坏情况; 对于大的、乱数列表一般相信是最快的已知排序

posted on 2012-03-16 11:32  xnfriday  阅读(233)  评论(0编辑  收藏  举报