// 数据结构_基数排序.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
/*
基数排序,使用记数排序,递归的从最低位到最高为进行排序
*/
/*这里我们只考虑十进制数*/
/*基数排序,一般使用在都是同样的位数的数进行排序*/
/*由于是十进制的数,所以都是小于等于9的数*/
/*基数排序的时间复杂度,跟多少位数有关系,比如我们用d来表示位数,k来表示每位数字都是介于0到K-1之间的数,n 个数进行排序
则时间复杂度为 d*(n+k) */
#define k 10
static int iwei_shu = 3;
int paixu_jishu(int a[],int ilength){
int j = 0;
int c[k];
char chtemp[3];
/*分配临时空间,大小和待排序的数据空间大小一致*/
int *b = (int *)malloc(sizeof(int)*ilength);
int *atemp = (int *)malloc(sizeof(int)*ilength);
/*依次从最低位开始取得数字,转换为整数,一直到最高位*/
for(j = 0; j < ilength; j++){
sprintf(chtemp,"%d",a[j]);
atemp[j] = chtemp[iwei_shu - 1] - '0';
}
/*计数的数组进行清0*/
for(j = 0; j < k; j++){
c[j] = 0;
}
/*分别得到等于0,1,2,3.....一直到9的数字个数*/
for(j = 0;j < ilength;j++){
c[atemp[j]] = c[atemp[j]] + 1;
}
printf("c:");
for(j = 0; j < k; j++){
printf(" %d ",c[j]);
}
printf("\n");
/*分别得到小于等于0,1,2,3.....一直到9的数字个数*/
for(j = 1; j < k; j++){
c[j] = c[j] + c[j-1];
}
for(j = 0; j < k; j++){
printf("%d ",c[j]);
}
printf("\n");
for(j = ilength - 1; j >= 0; j--){
// 注意这里跟计数排序有点不一样,因为我们是多位数,计数排序是b[c[atemp[j]] - 1] = atemp[j];
b[c[atemp[j]] - 1] = a[j];
c[atemp[j]] = c[atemp[j]] - 1;
}
printf("\n");
for(j = 0; j < ilength;j++){
a[j] = b[j];
printf("%d ",b[j]);
}
printf("\n");
free(b);
return 0;
}
int main(int argc, char* argv[])
{
int a[] = {214,323,564,632,790,254,316,603,691,709,545};
int i = 0;
int ilength = 0;
ilength = sizeof(a) / 4;
/*打印排序前数据*/
for(i = 0; i < ilength; i++){
printf("%d ",a[i]);
}
printf("\n");
/*从最低位开始进行记数排序*/
while(iwei_shu != 0){
paixu_jishu(a,ilength);
iwei_shu--;
}
/*打印排序后数据*/
for(i = 0; i < ilength; i++){
printf("%d ",a[i]);
}
printf("\n");
return 0;
}