数据结构-基数排序

基数排序(Radix Sorting)之前的排序都是关键字相互比较和移动完成。

基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。

分为:①多关键字排序,②链式基数排序两种


①多关键字排序,还分为两种方法:一,最高位优先,二,最低位优先

下面是最低位优先的方法,个十百千,的顺序

 初始     个位 -> 十位 -> 百位 ->千位 

7467     6792    9134    9134    1239

1247     9134    1239    9187    1247

3275     3275    1247   1239     3275

6792     4675    7467    1247    4675

9187     7467    3275    3275    6792

9134     1247    4675    7467    7467

4675     9187    9187    4675    9134

1239     1239    6792    6792    9187

输入:一张有n个数的表L ={ a1,a2,...,an } 和k位数字

过程:准备10个空表L[10][N],枚举1-k位( j ),每次遍历数组a(下标 i ),数a[ i ] 在第 j 位上为m,放在L[ m ][0]增1(L[m][0]为该表里的数字个数),数a[ i ]插在L[ m ]后面,遍历完数组后,重新将L[10][N]里的数字按顺序重新放回a[]数组里,继续枚举

输出:按非降序排列的L。

#include <cstdio>  
#include <cstring>  
#include <iostream>  
using namespace std;  
const int N=30;
void RadixSort(int *a,int k,int n){
	int tm,m,p;
	int L[10][N];//L[m][0]中存放为该表个数
	for(int j=1;j<=k;j++){
		for(int i=0;i<10;i++) L[i][0]=0; 
		for(int i=1; i<=n; i++){//取出数放到L里 
			tm=a[i];
			for(int l=1;l<j;l++) tm/=10;
			m=tm%10;
			L[m][0]++; p=L[m][0]; 
			L[m][p]=a[i];
		}
/*
printf("---%d----\n",j);
for(int i=0;i<10;i++){
	printf("%d: ",i);
	for(int l=0;l<=L[i][0];l++){
		printf("%d ",L[i][l]);
	}
	printf("\n");
}*/
		tm=1;
		for(int i=0;i<10;i++){
			for(int j=1;j<=L[i][0];j++){
				a[tm++]=L[i][j];
			}
		}
/*
for(int i=0;i<tm;i++){
	printf("%d ",a[i]);
}printf("\n");
*/
	}
}
int main()
{
	int a[N]={0,7467,1247,3275,6792,9187,9134,4675,1239};
	int len=8;
	
	RadixSort(a,4,len);	
	for(int i=1;i<=len;i++){
		printf("%d ",a[i]);
	}
	return 0;
}

②链式基数排序,

就是将上述程序中的表L[10][N] 变成十个链表,思想差不多,变成链表后,可以有效的节省空间。

就不会每个暂存表 浪费多余的长度。



基数排序到此结束。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值