zoukankan      html  css  js  c++  java
  • 计数排序

    计数排序是一种算法复杂度 O(n) 的排序方法,适合于小范围集合的排序。计数排序是一个类似于桶排序的排序算法,其优势是对已知数量范围的数组进行排序。它创建一个长度为这个数据范围的数组countArray,countArray中每个元素记录要排序数组中对应记录的出现个数。这个算法于1954年由 Harold H. Seward 提出。

    计数排序非常基础,它的主要目的是对整数排序并且会比普通的排序算法性能更好。例如,输入{ 8, 17,3,5,6,2,6,15}给计数排序,会输出 {2,3,5,6,6,8,15,17}这个算法由以下步骤组成:

    1. 初始化一个计数数组,大小是输入数组中的最大的数减去最小数再加一。然后将其每个数都置零。
    2. 遍历输入数组,遇到一个数就在计数数组对应的位置上加一。
    3. 把计数数组直接覆盖到输出数组(节约空间)。

    程序代码

     1 #include<iostream>
     2 
     3 #include<assert.h>
     4 
     5 using namespace std;
     6 
     7 void countSort(int *a,size_t size)
     8 
     9 {
    10 
    11   assert(a);
    12 
    13   int max=a[0];
    14 
    15   int min=a[0];
    16 
    17   for(size_t i=1;i<size;i++)
    18 
    19   {
    20 
    21     if(a[i]<min)
    22 
    23     {
    24 
    25         min=a[i];
    26 
    27     }
    28 
    29     else if(a[i]>max)
    30 
    31     {
    32 
    33         max=a[i];
    34 
    35     }
    36 
    37     int range=max-min+1;
    38 
    39     int *countArray=new int[range];
    40 
    41     memset(countArray,0,sizeof(int)*range);
    42 
    43     for(size_t i=0;i<size;i++)
    44 
    45     {
    46 
    47       countArray[a[i]-min]++;
    48 
    49     }
    50 
    51     sizt_t  index=0;
    52 
    53     for(size_t i=0;i<range;i++)
    54 
    55     {
    56 
    57       while(countArray[i]-->0)
    58 
    59       {
    60 
    61         a[index++]=i+min;
    62 
    63           }
    64 
    65     }
    66 
    67 }   
    68 
    69 void PrintArray(int *a, size_t size)
    70 {
    71    assert(a);
    72    for (size_t i = 0; i<size; i++)
    73    {
    74       cout<<a[i]<<" ";
    75    }
    76    cout << endl;   
    77 }
    78 void  main()
    79 {
    80      int  br[] = { 20, 80, 90, 589, 998, 965, 852, 123, 456, 789 };
    81    int len = sizeof(br) / sizeof(int);
    82    cout << "原数据如下:" << endl;
    83    PrintArray(br, len);
    84    cout << "排序后数据如下:" << endl;
    85    countSort(br, len);
    86    PrintArray(br, len);
    87    system("pause");
    88 } 
  • 相关阅读:
    【Vegas改编】发布infopath模板到sharepoint2007站点
    【Vegas原创】SBS关闭IPv6,你将会等待到天亮...
    详解Ntbackup的五种备份方式
    【Vegas原创】本地sys登录,ORA01031: insufficient privileges的解决方法
    【Vegas原创】访问owa,图片和js脚本不能正常显示和使用的解决方法
    【Vegas原创】Oracle中用sequence添加自增字段
    Key Small Business Server 2008 Log Files
    High Availability(高可靠性)技术简介
    [转载]给网游写一个挂吧(二) – 启动外挂上
    为什么到今天还要坚持写博客
  • 原文地址:https://www.cnblogs.com/yuanshuang/p/5373595.html
Copyright © 2011-2022 走看看