基础数据结构算法_计数排序,基数排序,桶排序

这三个是线性时间的排序算法,对排序的数据有一定要求。

计数排序:适合排序指定区间内的整数型,并且跨度不能太大。

简单来说就是开辟一个count[]数组,count[i]表示整数型i出现的次数。

然后从头到尾收集起来即可。

#include<iostream>
        #include<vector>
        #include<algorithm>
        #include<ctime>
        using namespace std;
        const int MAX=0x7fffffff;
        
        void countingsort(vector<int> &arr)
        {
        	int amin=MAX,amax=-MAX;
        	for(int i=0;i<arr.size();i++)
        	{
        		amin=min(amin,arr[i]);
        		amax=max(amax,arr[i]);
			}
			
			vector<int> count(amax-amin+1,0);
			
			for(int i=0;i<arr.size();i++)
				count[arr[i]-amin]++;
			
			int c=0;	
			for(int i=0;i<count.size();i++)
			{
				for(int j=0;j<count[i];j++)
				    arr[c++]=(i+amin);
			}
		}
        
        int main()
{
	    srand(time(NULL));
	    int n;
	    cin>>n;
	    vector<int> arr(n); 
	    for(int i=0;i<n;i++)
	        arr[i]=rand()-15000;//有随机负数 
	    
	    countingsort(arr);
	    
	    for(int i=0;i<n;i++)
	        cout<<arr[i]<<" ";
	    
	    return 0;
}
基数排序:要求待排序的数值型为正整数,然后以每个数的第一个为标准,按标准从小到大排序,再以第二位数为标准...

如此下去数组就有序了。

        #include<iostream>
        #include<vector>
        #include<ctime>
        using namespace std;
        
        int getbitnum(int num,int wb)
        {
        	while(wb>0)
        	{
        		num/=10;
        		wb--;
			}	
			return num%10;
		}
        
        void distributionsort(vector<int> &arr)
        {
        	vector< vector<int> > dis(10);
        	int wb=0;
        	while(dis[0].size()<arr.size())
        	{
        		for(int i=0;i<10;i++) dis[i].clear();
        		
        		for(int i=0;i<arr.size();i++)
        	  	    dis[getbitnum(arr[i],wb)].push_back(arr[i]);
        	  	wb++;
        	  	
        	  	int c=0;
        	    for(int i=0;i<dis.size();i++)
        		    for(int j=0;j<dis[i].size();j++)
        			    arr[c++]=dis[i][j];
			}
		}
        
        int main()
{ 
        srand(time(NULL));
        int n;
        cin>>n;
        vector<int> arr(n);
        for(int i=0;i<n;i++)
            arr[i]=rand();
        
        distributionsort(arr);
        
        for(int i=0;i<n;i++)
            cout<<arr[i]<<" ";
        
        return 0;
}


桶排序:这个感觉就是分一下桶,还是要借助别的排序算法。

我的是按数据范围分为n个桶,对每个桶进行计数排序。

        #include<iostream>
        #include<vector>
        #include<algorithm>
        #include<ctime>
        using namespace std;
        
        const int MAX=0x7fffffff;
        
        void countingsort(vector<int> &bucket)
        {
        	int amin=MAX,amax=-MAX;
        	for(int i=0;i<bucket.size();i++)
        	{
        		amin=min(amin,bucket[i]);
        		amax=max(amax,bucket[i]);
			}
			
			vector<int> count(amax-amin+1,0);
			
			for(int i=0;i<bucket.size();i++)
				count[bucket[i]-amin]++;
			
			int c=0;	
			for(int i=0;i<count.size();i++)
				for(int j=0;j<count[i];j++)
				    bucket[c++]=(i+amin);
		}
        
        void bucketsort(vector<int> &arr)
        {
        	int amin=MAX,amax=-MAX;
        	for(int i=0;i<arr.size();i++)
        	{
        		amin=min(amin,arr[i]);
        		amax=max(amax,arr[i]);
			}
			
			vector< vector<int> >coll(100);
			double L=(amax-amin)/99.0;
			for(int i=0;i<arr.size();i++)
				coll[int((arr[i]-amin)/L)].push_back(arr[i]);
			for(int i=0;i<coll.size();i++)
			    countingsort(coll[i]);
			
			int c=0;	
			for(int i=0;i<coll.size();i++)
				for(int j=0;j<coll[i].size();j++)
				    arr[c++]=coll[i][j];
		}
        
        int main()
{ 
        srand(time(NULL));
        int n;
        cin>>n;
        vector<int> arr(n);
        for(int i=0;i<n;i++)
            arr[i]=rand();
        
        bucketsort(arr);
        
        for(int i=0;i<n;i++)
            cout<<arr[i]<<" ";
        return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值