排序算法之基数排序

Posted 数据结构C语言版

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法之基数排序相关的知识,希望对你有一定的参考价值。

八大排序算法之基数排序

No.1  基本思想

将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

No.2 实例


No.3  C语言程序实现

程序框可以左右滑动哦~
#include<stdio.h>
#include<windows.h>
int getWidth(int *a,int n)
{
   int flag = a[0];
   int i;
   for(i=1;i<n;i++)
   {
       if(flag<a[i])
           flag = a[i];
   }
   int time=0;
   while(flag>0)
   {
       flag = flag/10;
       time++;
   }
   return time;
}
/*
*获取一个数第d位数的值,位数索引从0开始
*/

int getValue(int value, int d) {
   for (;d > 0 && value > 0; d--) {
       value = value /10;
   }
   return value % 10;
}
//桶操作
void innerCountingSort(int a[], int n, int d)
{
   int i,flag,j,k=0;
   int b[10];
   for(i=0;i<10;i++)
   {
       b[i] = 0;
   }
   int **p = (int **)malloc(10*sizeof(int *));
   for(i=0;i<10;i++)
   {
       p[i] = (int *)malloc(n*sizeof(int));
   }
   for(i = 0; i < n; i++)
   {
       flag = getValue(a[i], d);
       p[flag][b[flag]++] = a[i];
   }
   for(i=0;i<10;i++)
   {
       for(j=0;j<b[i];j++)
       {
           a[k++] = p[i][j];
       }
   }
   for(i=0;i<10;i++)
   {
       free(p[i]);
   }
   free(p);
}
//基数排序函数
void radixSort(int a[], int n,int width) {
   int i;
   for (i = 0; i < width; i++) {
       innerCountingSort(a, n, i);
   }
}
int main()
{
   int a[] = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
   int n= 28;
   int i;
   for(i=0;i<n;i++)
   {
       printf("%d\t",a[i]);
   }
   printf("\n\n");
   //确定数组中的最高位
   int width;
   width = getWidth(a,n);
   radixSort(a,n,width);
   for(i=0;i<n;i++)
   {
       printf("%d\t",a[i]);
   }
   printf("\n");
   system("pause");
   return 0;
}






以上是关于排序算法之基数排序的主要内容,如果未能解决你的问题,请参考以下文章

数据结构-排序之基数排序(使用java代码实现)

数据结构之排序算法Java实现—— 基数排序法

十大排序算法之基数排序

算法排序算法之基数排序

数据结构和算法(十七)排序算法之基数排序

排序算法之JAVA基数排序算法