线性时间的排序

1.计数排序
计数排序假设n个输入元素中的每一个都是0到k区间内的一个整数,其中k为某个整数。当k=O(n)时,排序的运行时间为O(n)。
伪代码:

//计数排序为稳定非原址排序
//A为输入,B为输出,k为输入整数最大值
CountingSort(A,B,k){
let C[0,k] be a new array
for i = 0 to A.length-1
    C[A[i]] = C[A[i]+1
//C[i] now contains the number of elements equal to i
for i = 1 to k
    C[i] = C[i]+C[i-1]
//C[i] now contains the number of elements <= i
for i = A.length-1 downto 1
    B[C[A[i]]] = A[i]
    C[A[i]] = C[A[i]]-1
}

2.基数排序
基数排序对元素位数相同的数组排序。非原址排序。
伪代码:

//假设n个d位的元素存放在数组A中,其中第1位是最低位,第d位是最高位
RadixSort(A,d){
    for i = 1 to d
        use a stable sort to sort array A on digit i
}

3.桶排序
桶排序假设输入数据服从均匀分布,元素均匀、独立地分布在[0,1)区间上。
桶排序将[0,1)区间划分为n个相同大小的子区间,或称为桶。然后,将n个输入数分别放到各个桶中。为了得到输出结果,我们先对每个桶中的数进行排序,然后遍历每个桶,按照次序把各个桶中的元素列出来即可。
伪代码:

//假设输入是一个包含n个元素的数组A,且每个元素A[i]满足0<=A[i]<1。
//此外,算法还需要一个临时数组B[0,n-1]来存放链表(即桶),并假设
//存在一种用于维护这些链表的机制
BucketSort(A){
    n = A.length
    let B[0,n-1] be a new array
    for i = 0 to n-1
        make B[i] an empty list
    for i = 0 to n-1
        insert A[i] into list B[floor(nA[i])]
    for i = 0 to n-1
        sort list B[i] with insertion sort
    concatenate the lists B[0],...,B[n-1] together in order
}

即使输入数据不服从均匀分布,桶排序也仍然可以在线性时间内完成,只要输入数据满足下列性质:所有桶的大小的平方和与总的元素呈线性关系。

你可能感兴趣的:(线性时间的排序)