算法导论第107页,计数排序的思想就是计算数组a中的某元素,若其大于x个数,则将它放入第x+1个位置。仿照书上的伪代码写的。代码如下:
// CountSort.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
//思想如有数组a中的某元素大于x个数,则将它放入第x+1个位置
void main(int argc, char* argv[])
{
int a[]={2,5,3,0,2,3,0,3};//排序区间在【0,5】之间
printf("计数排序前");
int i;
for(i=0;i<8;i++){
printf("%3d",a[i]);
}
int c[6];
int j;
//初始化 辅助数组c
for(j=0;j<6;j++){
c[j]=0;//
}
//用辅助数组c保存a中某值出现的次数 即数组c的下标为a中元素的值,数组c的值为a中该与元素相等的值个数
int m;
for(m=0;m<8;m++){
c[a[m]]=c[a[m]]+1;
}
//对于数组c中每个下标(数组a中的值),计算该下标的与之前下标的值的总和(即求数组a中有多少值是小于数组中a的某值的)
int n;
for(n=1;n<6;n++){
c[n]=c[n]+c[n-1];
}
int p;
int b[8];
for(p=7;p>-1;p--){
b[c[a[p]]-1]=a[p];
c[a[p]]=c[a[p]]-1;//放入b数组后,与a值相等的 个数减一 (用来避免数相等的情况)
}
printf("计数排序后");
int q;
for(q=0;q<8;q++){
printf("%3d",b[q]);
}
}