0
点赞
收藏
分享

微信扫一扫

基数排序(基数排序)

吴wuwu 2022-05-06 阅读 55
  • 题目链接:基数排序
  • 考查知识:基数排序
  • 题意描述:对n个整数进行基数排序
  • 相关知识:
    • 性能分析
      • 时间复杂度:平均时间复杂度为 O ( n d ) O(nd) O(nd),d为位数
      • 空间复杂度:用到了长度为n的辅助数组,因此空间复杂度为 O ( r + n ) O(r+n) O(r+n),r为基数
      • 算法稳定性:稳定
  • 具体代码
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e6;
    int a[N];
    int getMax(int a[],int n){//辅助函数找数组中的最大值
    	int mx=-1;
    	for(int i=0;i<n;i++){
    		mx=max(mx,a[i]);
    	} 
    	return mx;
    } 
    void RadixSort(int a[],int n){//基数排序 
    	int mx=getMax(a,n); 
    	for(int i=1;mx/i>0;i*=10){//枚举10^0,10^1,...,10^n,从个位开始,对数组a按位排序 
    		int cn[10]={0},t[n];//cn计数器,t存放本轮排序数组
    		for(int j=0;j<n;j++){//记录a[i]中每个数当前位的出现次数 
    			int k=(a[j]/i)%10;
    			cn[k]++;
    		} 
    		for(int j=1;j<10;j++){//数据在t中按该位排的最大位置,注意数组第一个数据下标0,计数器第一个数据下标1,所以下面计数器数组减1,即按位排得到的最大下标 
    			cn[j]+=cn[j-1];
    		}
    		for(int j=n-1;j>=0;j--){//已知按位排最大下标,逆序的从将数据存储到临时数组t中即可 
    			int k=(a[j]/i)%10;
    			t[cn[k]-1]=a[j];
    			cn[k]--;
    		} 
    		for(int j=0;j<n;j++){//t数组写回 
    			a[j]=t[j];
    		} 
    	} 
    } 
    void print(int a[],int n){
    	for(int i=0;i<n;i++){
    		cout<<a[i]<<" ";
    	}
    	cout<<endl;
    }
    int main(){
    	int n; 
    	cin>>n;
    	for(int i=0;i<n;i++)cin>>a[i];
    	RadixSort(a,n);
    	print(a,n);
    	return 0;
    }
    
举报

相关推荐

0 条评论