线性排序算法-计数排序

  一般的排序算法中如归并排序、堆排序和快速排序都是时间复杂度为O(nlgn)内的算法,其中归并排序和堆排序达到最坏情况下的上界,快速排序表现依赖于分区中平衡的划分,在均匀分布的情况下快速排序的运行时间上界为O(nlgn),如果数据时有序的话,复杂度可能达到 cita(n^2),都是比用比较的方式进行排序,比较排序可以抽象对一颗决策树(完全二叉树)。下面介绍一些一些线性排序的算法,其时间复杂度为 cita(N),常见的线性排序算法有计数排序、基数排序和桶排序等。

  一、计数排序

计数排序数组A[N]必须满足数组中的元素必须在{0,k}区间的整数。根据算法导论中的解释,我们来看看一下算法的执行过程:

1:对需要排序的数组A遍历,申请一个长度为K(k为数组A元素的最大区间),如果数组C下标值等A[n],C[m]值累加

2.遍历数组C,对C元素前项累加

3.申请一个长度等同于A的B数组

4.遍历A数组,将值存入到与C数组中下标相同,并将C下标下的值赋值到一个临时变量,然后将A数组值 赋值给 B数组下标等于临时变量的元素。

 

代码如下python的实现:

'''
计数据排序,数组中满足(A[n]<k,0<=n<A.length),将A排序到B中
'''
def countingSort(A,B,k):
    #初始化计数器
    countArr=[]
    for x in range(k):
        countArr.append(0)
    #对A累积统计,将A的值作为计数器计算器的下标
    for x in range(len(A)):#这里为了方便,还是使用常规的索引遍历
        countArr[A[x]]+=1
    #累加计数器转换为可现实A存储下标
    for x in range(1,len(countArr),1):
        countArr[x]+=countArr[x-1]
    #倒序循环A.length,将计数结果复制给新的数组
    for x in range(len(A)-1,-1,-1):
        B[countArr[A[x]]-1]=A[x]
        countArr[A[x]]-=1

总结,计数排序从本质上讲是空间换时间的一种排序算法,如果需要排序的数据层离散化,并且在某段范围内分布均匀,如电话号码的排序,就特别适合,巧妙利用了数组下标和数据之间的关系。同时,这个和后面要将的桶排序还是有区别的,对于重复数据的排序计数排序更适合。

 

...

 

posted on 2013-09-29 11:52  无为在歧路  阅读(314)  评论(0编辑  收藏  举报

导航