排序算法之基数排序
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;
}
以上是关于排序算法之基数排序的主要内容,如果未能解决你的问题,请参考以下文章