数据结构-基数排序

来源:互联网 发布:讲文明知礼仪内容15个 编辑:程序博客网 时间:2024/06/07 10:20

基数排序(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
原创粉丝点击