线性排序算法-计数排序
一般的排序算法中如归并排序、堆排序和快速排序都是时间复杂度为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
总结,计数排序从本质上讲是空间换时间的一种排序算法,如果需要排序的数据层离散化,并且在某段范围内分布均匀,如电话号码的排序,就特别适合,巧妙利用了数组下标和数据之间的关系。同时,这个和后面要将的桶排序还是有区别的,对于重复数据的排序计数排序更适合。
...