《算法导论》 上的计数排序

来源:互联网 发布:终极一班3 网络点击率 编辑:程序博客网 时间:2024/06/05 09:08
#include <iostream>
#include 
<string>
using namespace std;
const int MaxN = 40;

void counting_sort(int A[],int B[], int k)
{
    
int C[MaxN];
    
//for(int i = 0; i < MaxN; i++)
    
//    C[i] =0;//初始化
    memset(C, 0sizeof(C)/sizeof(C[0]));
    
for(int i = 0; i < k; i++)
      C[A[i]] 
= C[A[i]] + 1//C[i]包含元素值是i的个数
       
// cout<<"C["<<A[i]<<"]=" <<C[A[i]]<<'';
    for(int j = 1; j < k; j++)
        C[j] 
= C[j] + C[j-1];//C[i]包含等于或小于i的元素的个数
    for(j = k-1; j >= 0; j--)
    
{
        B[C[A[j]]
-1= A[j];
        C[A[j]] 
= C[A[j]] -1;
    }
//对于每个A[j], 值C[A[j]]即为A[j]在输出数组中的最终位置,因为共有C[A[j]]
    
//个元素小于等于A[j].由于各个元素可能不一定是不同的,因此,每当将一个值A[j]放在数组B中,
    
//都要减小C[A[j]]的值。
          
 
        }


int main()

{   
    
int A[6]={4,4,5,1,1,1};
    
int B[MaxN];
    memset(B, 
0, MaxN);
    counting_sort(A, B, 
6);

    
for(int i = 0; i < sizeof(A)/sizeof(A[0]); i++)
    cout
<<"B["<<i<<"]=" <<B[i]<<'';
    
    
return 0;
}

//《算法导论》中:计数排序的思想就是对每一个输入元素x,确定出小于x的元素个数
//但是我觉得计数排序的应用范围太狭小了,对于元素相差较大者,不易使用。
//如果按照元素的比较方法来实现到可以克服这个问题,但是计算排序的效率高就在于不比较元素之间的
//大小来实现。否则,效率一定会降低,而且演化成比较排序。