• 基数排序


         在箱子排序中,尽管时间复制度仅仅有(n),但假设其箱子序列较大的话将会导致程序的空间复杂度较大,所以对于对于属性值跨度比較大的序列能够採用基数排序法。

        概述:详细的做法是并不直接对这些数排序,而是採用一些基数来分解这些数,比如:用基数10来分解3725能够得到3、7、2和5。

    而利用60来分解能够得到1、2、5。

    然后再依据每一位基数从低位到高位对原数据进

    行排序,即若最长的基数有m位。直到共进行了m次排序后则基数排序完毕。

        特点:能够在o(n)时间内对0到 -1之间的n个整数进行排序。当中c为常数。

        演示样例:

        问题一:对以下的序列进行排序:

        {216,521,425,116,91,515,124,12434,96,24,5}

        问题二:对以下的序列进行排序:

      {1123,1657,88865,22,546,9908,111111,78786,22,515,515,9908,414,33,4,90,8765,12,543,66,99}

        演示样例实现代码及结果例如以下:

    #include<iostream>
    #include<deque>
    #include<algorithm>
    #include<iterator>
    #include<vector>
    #include<map>
    using namespace std;
    
    //将10进制数data分解成n进制数的序列
    deque<int> trans(int data,int n)
    {
    	deque<int> deq;
    	for ( ; 0!=data ; )
    	{
    		deq.push_front(data%n);
    		data = (data-data%n)/n;
    	}
    	return deq;
    }
    
    void basic_sort(vector<int> & datas,int basic)
    {
    	//求出每一个数的基数并关联起来
    	map<int,deque<int>> ma;
    	for (vector<int>::iterator iter = datas.begin();iter!=datas.end();iter++)
    	{
    		ma[*iter] = trans(*iter,basic);
    	}
    	//找出最长基数个数
    	int length = 0;
    	for(map<int,deque<int>>::iterator iter = ma.begin();iter!=ma.end();iter++)
    	{
    		if(length<iter->second.size())
    			length = iter->second.size();
    	}
    	//进行每一位基数的n轮排序
    	for (int i = 0; i < length; i++)
    	{
    		//建立箱子序列
    		vector<vector<int>> box(basic);
    		//開始排序
    		for (vector<int>::iterator iter = datas.begin();iter!=datas.end();iter++)
    		{
    			//找到当前当前第i位的基数,并依据基数装箱
    			int n = 0;
    			if (i<ma[*iter].size())
    			{
    				n = ma[*iter][ma[*iter].size()-i-1];
    			}
    			box[n].push_back(*iter);
    		}
    		//将排序后结果复制给datas
    		datas.clear();
    		for (vector<vector<int>>::iterator iter = box.begin();iter!=box.end();iter++ )
    		{
    				for (vector<int>::iterator it = (*iter).begin(); it!=(*iter).end() ; it++)
    				{
    					datas.push_back(*it);
    				}
    		}
    	}
    }
    
    int main()
    {
    	//解决这个问题一
    	int array1[] = {216,521,425,116,91,515,124,12434,96,24,5};
    	vector<int> vec(array1,array1+sizeof(array1)/sizeof(array1[0]));
    	basic_sort(vec,10);
    	copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));
    	cout<<endl;
    
    	//解决这个问题二
    	int array2[] = {1123,1657,88865,22,546,9908,111111,78786,22,515,515,9908,414,33,4,90,8765,12,543,66,99};
    	vector<int> vec1(array2,array2+sizeof(array2)/sizeof(array2[0]));
    	basic_sort(vec1,60);
    	copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
    	cout<<endl;
    }
    
    /*
     5 24 91 96 116 124 216 425 515 521 12434
     4 12 22 22 33 66 90 99 414 515 515 543 546 1123 1657 8765 9908 9908 78786 88865 111111
     请按随意键继续. . .
    */


  • 相关阅读:
    上传base64编码图片
    mysql
    当程序员老去 揭秘不为人知背后的辛酸故事
    Java中break的作用
    Random类
    使用dsoframer控件出现"Unable to display the inactive document. Click here to reactivate the document."的问题
    给IT新人的15个建议:苦逼程序员的辛酸反省与总结
    XML开发总结
    解决Office软件冲突问题
    PopupMenu控件的使用
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5357813.html
Copyright © 2020-2023  润新知