基数排序

还是有点东西的

说白了基数排序就是从地位开始比较,如果当前位没有就是0
有个技巧需要注意代码里说了

代码

#include<bits/stdc++.h>
using namespace std;
int a[100];
int n,ma;
void st1(int cur){
	int b[10]={0};
	int c[100];
	for(int i=0;i<n;i++)
	b[(a[i]/cur)%10]++;
	
	for(int i=1;i<10;i++)
	b[i]+=b[i-1];
	//下面这个地方尤为关键为啥从n-1开始,而不是0开始
//	 因为是从最低为开始的,前面已经在地位排好了,如果从0开始
//	 如果当前位两个数字为0,那么他们的相对位置应该不变
//	 0开始就反了,顺序错了。 
	for(int i=n-1;i>=0;i--)
	{
		//精髓所在 
		c[b[(a[i]/cur)%10]-1]=a[i];
		b[(a[i]/cur)%10]--;
	}
	
	for(int i=0;i<n;i++)
	a[i]=c[i];
}
void st2(){
	for(int i=1;ma/i>0;i*=10)
	st1(i);
}
int main(){
 
	while(cin>>n){
		ma=0;
		for(int i=0;i<n;i++){
		  cin>>a[i]; ma=max(a[i],ma);	
		}
		puts("before sort");
		for(int i=0;i<n;i++)
		cout<<a[i]<<' ';
		puts("");
		st2();
		puts("after sort");
		for(int i=0;i<n;i++)
		cout<<a[i]<<' ';
		puts("");
	}
	return 0;
}
posted @ 2019-05-27 18:08  ChunhaoMo  阅读(81)  评论(0编辑  收藏  举报