排序算法---基数排序

基数排序的主要思路是,将所有待比较数值(注意,必须是正整数)统一为同样的数位长度,数位较短的数前面补零. 然后, 从最低位开始, 依次进行一次稳定排序

比如这样一个数列排序: 342 58 576 356, 以下描述演示了具体的排序过程(红色字体表示正在排序的数位)

第一次排序(个位):

3 4 2

5 7 6

3 5 6

0 5 8

第二次排序(十位):

4 2

5 6

5 8

7 6

第三次排序(百位):

0 5 8

3 4 2

3 5 6

5 7 6

结果: 58 342 356 576

基本排序思想已搞定,可实现起来还是会有些许困难。

先看C语言代码:


#include <stdio.h>

int lengthOfNnm(int n){
	if(n>=0&&n<10) {
		return 1;
	}else{
		int m = 0;
		while(n>=1){
			n=n/10;
			m++;
		}
		return m;
	}
}
int getKey(int n,int index){//获取第index 位上的数值
	switch (index)
	{
		case 1:
			n=n%10;
			break;
		case 2:
			n=(n%100)/10;
			break;
		case 3:
			n=(n%1000)/100;
			break;
		//。。。此次测试 3个足矣 
		default:n=-1;
			break;
	}
	return n;
}

void sort(int v[] ,int index){
	int temp[8];
	int counts[10];
	for(int i = 0;i<10;i++){//初始化操作
		counts[i] = 0;
	}
	for(int i = 0;i<8;i++){//对 indx 位计数
		counts[ getKey(v[i],index) ] ++;
	}
	for(int i = 1;i<10;i++){//累加操作
		counts[i]+= counts[i-1];
	}
	for(int i = 8-1 ;i>=0;i--){//从左端开始复制记录
		int j = getKey(v[i],index) ;
		temp[ counts[j] - 1 ] = v[i];
		counts[j]--;	
	}
	for(int i = 0;i<8;i++){
		v[i] = temp[i];
	}
}
int main(int argc, char *argv[])
{
	int a[]={
		659,248,175,198,886,23,237,560
	};
	int max = a[0];
	for(int i = 0;i<8;i++){
		printf("%d   ",a[i]);
		if(a[i] > max){
			max = a[i];
		}
	}
	printf("\n");
	int times = lengthOfNnm(max);
	for(int i = 1;i<=times;i++){//最大数为几位则循环几次
		sort(a,i);
	}
	for(int i = 0;i<8;i++){
		printf("%d   ",a[i]);
	}
	printf("\n");
	return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值