数据结构(分配排序)

1、采用先分配后收集的思想来对数据进行排序

2、举例基数排序(先按最低位排序依次分配到10个不同的数组中去),也可以采用从高到低的方法但这样明显会利用到递归的思想

基数排序

3、采用链式存储方式则可克服时间和空间消耗问题。

      基数排序时间复杂性基于基数和排序码的长度,每执行一次分配和收集,队列初始化需要O(r)时间,分配工作需要O(n)时间,收集工作需要O(r)时间,每趟O(n + 2r)时间,进行d趟共需要O(d + 2r)时间

4、采用顺序结构的方式,用一个数组存放待排序的n个记录,用r个数组存放r个队列,每个队列大约需要n个记录空间。

       每分配一次,需要移动n个记录,每收集一次也需要移动n个记录,d趟分配和收集需要移动2*n*d个记录,且需要r-n个附加的记录空间。

#include<bits/stdc++.h>
using namespace std;

//基数排序:从小到大
template<class T>
void rSort(T a[], int n)//n表示数组里的个数
{ 
	queue<T> que[10];
	//确定回合数R
	int R=0; 
	T  mx=a[0]; 
	for(int i=1; i<n; i++) //找最大值mx 
	{
		mx = max(a[i], mx);
	}
	while(mx)
	{ 
		R++;
		mx /= 10;
	}//找最大位数
 //cout<<"R="<<R<<endl; //***
 
 //基数排序
	int d = 1;
	for(int i = 1; i <= R; i++)
	{ //将数据分配到10个队列中
		for(int j = 0; j < n ; j++)
		{ 
			int t = a[j] / d % 10;
			que[t].push(a[j]);
		} 
		d *= 10;

		//收集10个队列里的数据
		int p = 0;
		for(int j=0; j<10; j++)
		{ 
			while(que[j].size())
			{ 
				a[p++] = que[j].front();//将第一次排好序的数据放会a数组中
				que[j].pop();
			//cout<<a[p-1]<<" "; //***
			}
			//cout<<endl; //***
		} 
	}
}
 	
int main()
{ 
	int a[10]={0,45,723,23,3,45,5,8,9,12345};
 
	rSort(a, 10);
	for(int i=0; i<10; i++) cout<<a[i]<<" ";
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值