计数排序

淡淡的烟草味﹌ 2021-09-23 03:22 472阅读 0赞

计数排序:
假设n个输入元素中的每一个都是在0~区间内的一个整数,其中k为某个整数。当k=O(n)是,排序时间为O(n).
基本思想:对每个输入元素x,确定小于x元素的个数。利用这一信息,可以直接把x放到输出数组的位置上。例如,有17个元素小于x,则x就应该在第18个输出位置上。
输入:数组A[1,n] 借助数组C[0,k]存放元素x的个数
输出:数组B[1,n]

  1. COUNTING-SORT(A,B,k)
  2. 创建数组C[0,k]
  3. 初始化数组C[i]=0
  4. for i=0 to k
  5. C[i]=0
  6. //C[i]为每个元素的个数
  7. for j=1 to A.length
  8. C[A[j]]= C[A[j]]++;
  9. //C[i]为每个比i小或等于i的元素个数
  10. for i=1 to k
  11. C[i]=C[i]+C[i-1]
  12. for j=A.length downto 1
  13. B[C[A[j]]]=A[j]
  14. C[A[j]]= C[A[j]]-1

Java实现

  1. import java.util.Random;
  2. public class Main {
  3. private static int N=10;
  4. private static int k=20;
  5. static Random rand = new Random();
  6. //计数排序适用于数组中的最大数k==n
  7. public static void main(String[] args) {
  8. // TODO Auto-generated method stub
  9. test_Counting_sort();
  10. }
  11. private static void test_Counting_sort() {
  12. // TODO Auto-generated method stub
  13. int[] A=new int[N];
  14. for(int i=0;i<A.length;i++){
  15. A[i]=rand.nextInt(k);
  16. }
  17. System.out.println("排序前:");
  18. print(A);
  19. int[] B=new int[N];
  20. Counting_Sort(A,B);
  21. System.out.println("排序后:");
  22. print(B);
  23. }
  24. private static void Counting_Sort(int[] A, int[] B) {
  25. // TODO Auto-generated method stub
  26. //注意:A中的每个元素均小于等于k
  27. int[] C=new int[k];
  28. //初始化C使得数组C的,每个元素初始值为0
  29. for(int i=0;i<C.length;i++){
  30. C[i]=0;
  31. }
  32. //C[i]为元素i的个数
  33. for(int i=0;i<A.length;i++){
  34. C[A[i]]++;
  35. }
  36. //C[i]为小于等于元素i的个数
  37. for(int i=1;i<C.length;i++){
  38. C[i]=C[i]+C[i-1];
  39. }
  40. //得到输出的元素B[i]
  41. for(int i=A.length-1;i>=0;i--){
  42. B[C[A[i]]-1]=A[i];//索引从0开始 故需要减1
  43. C[A[i]]--;
  44. }
  45. }
  46. // 打印数组
  47. private static void print(int[] A) {
  48. // TODO Auto-generated method stub
  49. for (int i = 0; i < A.length; i++) {
  50. System.out.print(A[i] + "\t");
  51. }
  52. System.out.println();
  53. }
  54. }

运行结果

发表评论

表情:
评论列表 (有 0 条评论,472人围观)

还没有评论,来说两句吧...

相关阅读

    相关 计数排序

    计数排序 冒泡、选择、插入、归并、快速、希尔、堆排序,都是基于比较的排序,平均时间复杂度最低是O(nlogn)。 计数排序、桶排序、基数排序,都不是基于比较的排序,它们

    相关 排序算法——计数排序

    排序算法——计数排序 > 计数排序是一个非基于比较的排序算法。它的优势在于在对一定范围内的整数排序时,快于任何比较排序算法。 这是一种牺牲空间换取时间的做法,当O(k)>

    相关 计数排序

    计数排序,他的主要目的是对整数排序并且会比普通的排序算法性能更好。 1. 初始化一个计数数组,大小是输入数组中的最大的数。 2. 遍历输入数组,遇到一个数

    相关 计数排序

    对于一个int数组,请编写一个计数排序算法,对数组元素排序。 给定一个int数组A及数组的大小n,请返回排序后的数组。 测试样例: [1,2,3,5,2,

    相关 计数排序

    / 计数排序:统计小于等于该元素值的元素的个数i,于是该元素就放在目标数组的索引i位(i≥0)。 计数排序基于一个假设,待排序数列的

    相关 计数排序

    计数排序: 假设n个输入元素中的每一个都是在0~区间内的一个整数,其中k为某个整数。当k=O(n)是,排序时间为O(n). 基本思想:对每个输入元素x,确定小于x元素的