(p111)基数排序(子程序是计数排序)

来源:互联网 发布:centos打开防火墙命令 编辑:程序博客网 时间:2024/05/15 09:13
/* * sort.c * *  Created on: Feb 14, 2016 *      Author: wing */#include<stdio.h>#include<stdlib.h>int figk(int n){int c=0;while (n!=0){c++;n=n/10;}return c;}int getdigit(int n,int k){int i;for (i=1;i<k;i++)n/=10;return n%10;}int digitsort(int *num,int k,int n,int *result){int i,tmp[10];for (i=0;i<10;i++)tmp[i]=0;for (i=1;i<=n;i++)tmp[getdigit(num[i],k)]++;for (i=1;i<=9;i++)tmp[i]+=tmp[i-1];for (i=n;i>0;i--)/*注意一定要downto才行,这实际上是计数排序,只有这样才具有稳定性,关于什么是稳定性,参看算法导论p110*/{result[tmp[getdigit(num[i],k)]]=num[i];tmp[getdigit(num[i],k)]--;}return 0;}int main(void){int *num,n,i,maxk=0,k,*result,*p;scanf("%d",&n);num=(int *)malloc(sizeof(int)*(n+1));result=(int *)malloc(sizeof(int)*(n+1));for (i=1;i<=n;i++){scanf("%d",&num[i]);maxk=figk(num[i])>maxk?figk(num[i]):maxk;}for (k=1;k<=maxk;k++){digitsort(num,k,n,result);p=num;num=result;result=p;/*需要不停的迭代*/}for (i=1;i<=n;i++)printf("%d ",num[i]);/*注意排完序后又交换了一次*/return 0;}

0 0
原创粉丝点击