// 数据结构_记数排序.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
/*计数排序
计数排序假设n个输入元素中的每一个都是介于0到k之间的整数,此处k为某个整数
计数排序的运行时间为n*/
/*算法导论中的伪代码
COUNTING-SORT(A,B,k)
1 for i <- 0 to k
2 do C[i] <- 0
3 for j <- 1 to length[A]
4 do C[A[j]] <- C[A[j]] + 1
5 // C[j] 包含等于i的元素个数
6 for i <- 1 to k
7 do C[i] <- C[i] + C[i-1]
8 // C[i] 包含小于等于i的元素个数
9 for j <- length[A] downto 1
10 do B[C[A[j]]] <- A[j]
11 C[A[j]] <- C[A[j]] - 1
*/
/*计数排序的时间复杂度为N*/
#define array_length 10
#define k 5
int main(int argc, char* argv[])
{
int i = 0,j = 0;
int a[]= {1,2,5,3,0,2,3,0,3,4};
int b[array_length];
/*这里我们以小于5的数做例子*/
int c[k+1];
int length;
length = 8;
/*我们因为是计算小于等于5的各个非负整数的个数,所以这里我们只需要6个空间
首先将其清零
*/
for(i = 0; i < k+1;i++){
c[i] = 0;
}
/*这里,我们用待计算数组,也就是a数组的值做为c数组的的下标
所以,经过下面的循环后,c数组中的存储的是,a数组0,1,2,3,4,5的个数
*/
for(j = 1; j < array_length; j++){
c[a[j]] = c[a[j]] + 1;
}
/*下面这个循环就是,得到小于等于0,1,2,3,4,5的个数*/
for(i = 1; i < k+1;i++){
c[i] = c[i] + c[i-1];
}
/*
*/
for(j = array_length-1; j > 0; j--){
b[c[a[j]]] = a[j];
c[a[j]] = c[a[j]] - 1;
}
printf("\n");
for(j = 1; j < array_length; j++){
printf("%d ",b[j]);
}
return 0;
}