线性时间排序

来源:互联网 发布:php socket的使用 编辑:程序博客网 时间:2024/06/06 01:58
#include<stdio.h>//A为排序前的数组,n为A长度,B为排序后数组,k为【0,k】之间的数排序void counting_sort(int A[], int n, int B[], int k);void print(int B[], int n);//基数排序d为位数void radix_sort(int A[], int n, int d);//返回num中第n位的数(从右往左)int digit_of_num(int num,int n);//对A的第d位进行稳定排序(基于计数排序)void stable_sort(int A[], int n, int d);int main(int argc, char *argv[]){  int a[]={0,2,5,3,0,2,3,0,3};  int b[10];  counting_sort(a,8,b,5);  print(b,8);  int A[]={0,329,457,657,839,436,720,355,11};  radix_sort(A,8,3);  print(A,8);  return 0;}void radix_sort(int A[], int n, int d){  int i;  for(i=1;i<=d;++i)    stable_sort(A,n,i); }void stable_sort(int A[], int n, int d){  int i,j;  int a[50]={0};  int b[50]={0};//记录排序后的A  int c[10]={0};//按d位排序后的下标  for(i=1;i<=n;++i)    a[i]=digit_of_num(A[i],d);  for(j=1;j<=n;++j)    c[a[j]]+=1;  for(i=1;i<=10;++i)    c[i]+=c[i-1];  for(j=n;j>=0;--j){    b[c[a[j]]]=A[j];    c[a[j]]-=1;  }  for(i=1;i<=n;++i)    A[i]=b[i];}int digit_of_num(int num,int n){  int i;  for(i=1;i<=n-1;++i)    num/=10;  return num%10;}void counting_sort(int A[], int n, int B[], int k){  int i,j;  int c[10]={0};  for(j=1;j<=n;++j)    c[A[j]]+=1;  for(i=1;i<=k;++i)    c[i]+=c[i-1];  for(j=n;j>=0;--j){    B[c[A[j]]]=A[j];    c[A[j]]-=1;  }}void print(int B[], int n){  int i=0;  for(i=1;i<=n;++i)    printf("%d ",B[i]);  printf("\n");}