排序十 计数排序
2017-12-28 23:16
127 查看
计数排序(Counting Sort)
计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的时间复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法,当然这是一种牺牲空间换取时间的做法。—百度百科计数排序也有基于比较的实现方式,但是其时间复杂度为O(n2),所以这种方式通常没用使用的价值。可以参考kkun或神秘博士来袭这两位文章中的介绍。
后文中的示例的代码介绍的是基于分布实现的计数排序。
时间复杂度:O(n+k),k=MaxNumber(array)
空间复杂度:O(k),k=MaxNumber(array)
稳定性: 稳定
算法描述
计算数组S的最大值k建立长度位k+1的计数数组count
计算数量:遍历序列S元素,对应的数组count位置+1
计算分布:根据count中元素的数量,计算元素的分布
根据元素分布排序数组
排序示例
假设有数组:S[2,1,3,4,3,2,1,4,3,2]1. 计算数量
计数数组 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
次数 | 0 | 2 | 3 | 3 | 2 |
2. 计算分布
分布数组 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
分布值 | 0 | 2 | 5 | 8 | 10 |
3. 排序
根据2中分布值的结果即可得到排序结果为:
S[1,1,2,2,2,3,3,3,4,4]
示例代码
public static void CountingSort(int[] S) { //C# int min = S.Min(); int[] count = new int[S.Max() - min + 1];//计数数组,存放各元素出现的次数 int[] bucket = new int[S.Length];//桶,用于装排序后的数据 for (int i = 0; i < S.Length; i++) { count[S[i] - min]++; //计算各元素出现的次数 } for (int i = 1; i < count.Length; i++) { count[i] += count[i - 1]; //计算各元素的分布值 } for (int i = S.Length - 1; i >= 0; i--) { int j = S[i] - min; bucket[count[j] - 1] = S[i]; //根据分布将元素倒入桶中 count[j]--; } Array.Copy(bucket, S, bucket.Length); //将桶中元素倒回原数组 }
def counting_sort(s): #Python min_num = min(s) count = [0] * (max(s) - min_num + 1) buckets = [0] * len(s) for item in s: count[item - min_num] += 1 for i in range(1, len(count)): count[i] += count[i-1] for i in range(len(s)-1, -1, -1): j = s[i] - min_num buckets[count[j] - 1] = s[i] count[j] -= 1 for i in range(len(s)): s[i] = buckets[i]
文中若有什么错误,欢迎留言指正。
转载请保留出处:http://blog.csdn.net/x1060549/article/details/78927426
相关文章推荐
- 【数据结构】非比较排序的算法实现(包括计数排序、计数排序)
- 基于运算的排序:计数排序
- 由Maximum Gap,谈桶排序,基数排序和计数排序
- 源码系列:计数排序、基数排序、桶排序
- 排序基础之非比较的计数排序、桶排序、基数排序(Java实现)
- 笔记二:计数排序、选择排序、冒泡排序、插入排序
- 基本排序方法及分析(八):CoungtingSort 计数排序
- 三种线性排序算法: 计数排序、桶排序与基数排序
- 排序——计数排序
- 排序9:计数排序
- 非比较排序——计数排序
- 【java】计数排序 基数排序
- 排序总结系列九:计数排序(Counting sort)
- 线性时间排序:计数排序、计数排序、桶排序
- 【算法导论】线性时间排序之 决策树&计数排序
- 基本排序系列之计数排序
- 程序猿找工作必练内功:排序算法大总结(五)——线性时间排序算法(计数排序,基数排序,桶排序)
- 数据结构 28 排序 计数排序 基数排序 桶排序
- 算法之排序 排序第六篇 计数排序(count sort)
- 【算法导论-学习笔记】以线性时间增长的排序——计数排序