现在的位置: 首页 > 综合 > 正文

非比较排序 [Algorithm]

2013年10月07日 ⁄ 综合 ⁄ 共 2657字 ⁄ 字号 评论关闭

序言

    非比较排序,不需要比较,交换,在线性时间内完成排序。缺点:空间要求较多,不是原地排序,典型的空间换取时间。

计数排序

    计数排序利用一个特点:已经排好序(例如从小到大)的数组中,第i个元素为x,则数组中一定有:小于等于x的元素有i个。计数排序需要一个空间代价:n + max_num.

桶排序

    桶排序包含两个步骤:分发元素到每个桶内;顺序回收桶内元素。伪代码如下:

BUCKET_SORT (A)

  1. n
    length [A]
  2. For i = 1 to n do
  3.     Insert A[i] into list
    B
    [nA[i]]
  4. For i = 0 to n-1 do
  5.     Sort list B with Insertion sort
  6. Concatenate the lists B[0], B[1], . . B[n-1] together in order.

代码实现

bucket_sort是直接遍历count 判断是否大于1,回收元素,counting_sort是把count的内容转化为原数组排序后该元素前面元素的个数,同样需要遍历一次。

 

测试结果:

 

计数和桶排序时间上的优势不用说了,但是这些非比较排序算法对空间要求比较高,而且跟排序数据的分布也有关。上面的测试结果是基于所有随机数据都在[0-255]之间的假设前提。数据分布越散乱,空间复杂度越高。

后记

桶排序的思路尤其适合字符串数组的排序,因为acsii字符都位于0,255之间。更加一般的桶排序可以使用链表,有时间再续吧~

抱歉!评论已关闭.