目录
一、算法思路
二、C#语言实现
三、C语言实现
一、算法思路
1. 思想基础
基数排序的思想就是先找出待排序中的最大者,然后按最大者申请一个足够大的内存空间,并将其初始化为零,然后将所有待排序的数装入其中,标记装入的数,最后按下标依次返回所有数即可。
2. 函数
public void RadixSort(int []A,int n)
{
int Max,i,j,m,nz;
Max=A[0];
for (i=0;i<n;i++)//获得待排序列中的最大值
{
if (A[i]>Max)
Max=A[i];
}
Max++;
//以这个最大树为桶申请内存,装入所有数
int[] pt = new int[Max];
for(i=0;i<Max;i++)//将数组中的所有数初始化为零
pt[i]=0;
for(i=0;i<n;i++)//把这些数据逐个放入这些桶里
{
m=A[i];
pt[m]++;//让装入的数去做数组的下标
}
m=0; //回收数据,m是排序结果的下标值
for(i=0;i<Max;i++)
{
nz=pt[i];
for(j=0;j<nz;j++)
A[m++]=i;
}
}
二、C#语言实现
private void button1_Click(object sender, EventArgs e)
{int i;int []a={278,109,63,83,930,589,184,505,269,8,83};//待排序数RadixSort(a,11);listBox1.Items.Clear();for (i = 0; i < 10; i++)listBox1.Items.Add(a[i].ToString());
}
private void button2_Click(object sender, EventArgs e)
{this.Close();
}
运行情况(完整程序见工程“基数排序”):
从上面可以看出,基数排序的思想和过程都比较简单,但效率不是很高。通过该程序,使得对计算机内存有了更深层次的理解;对于基数排序方法,要注意三点:1 构造桶;2 把数据放进桶里; 3 回收数据。
三、C语言实现
#include<stdlib.h>
#include<stdio.h>
#include<windows.h>
void RadixSort(int A[],int n)
{
int Max,i,j,m,nz;
int *pt;
Max=A[0];
for (i=0;i<n;i++){if (A[i]>Max) Max=A[i];}
Max++;
pt=(int *)malloc(Max*sizeof(int));
if (!pt) return;for(i=0;i<Max;i++)pt[i]=0;for(i=0;i<n;i++){m=A[i];pt[m]++;}
m=0;
for(i=0;i<Max;i++){nz=pt[i];for(j=0;j<nz;j++)A[m++]=i;}
free(pt);
}
//获得n个不重复的随机数,具体算法不用管
void CreateData(int A[],int n)
{int i,j;srand((unsigned)time(NULL));for(i=0;i<n;i++){A[i]=rand()%n;//以下内容是消除重复,但在数据规模很大的情况下这个过程异常缓慢。/*for(j=0;j<i;j++)while(A[j]==A[i]){A[i]=rand()%n;j=0;}*/}
}void DispTime(SYSTEMTIME sys)
{printf("%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d\n" ,sys.wYear,sys.wMonth,sys.wDay ,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds ,sys.wDayOfWeek);
}char * DiffTime(SYSTEMTIME systime0,SYSTEMTIME systime1)
{char st[128];sprintf(st,"%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d\n",systime0.wYear-systime1.wYear,systime0.wMonth-systime1.wMonth,systime0.wDay-systime1.wDay ,systime0.wHour-systime1.wHour,systime0.wMinute-systime1.wMinute,systime0.wSecond-systime1.wSecond,systime0.wMilliseconds-systime1.wMilliseconds ,systime0.wDayOfWeek-systime1.wDayOfWeek); return st;
}main()
{int i,n=0,m;int *A;SYSTEMTIME sys0,sys1;printf("请输入要排序的数据个数:");scanf("%d",&m);if(m<0){printf("滚!不解释~\n");exit(0);}A=(int *)malloc(sizeof(int)*m);if(A==NULL){printf("内存不足、程序退出\n");exit(0);}//获得随机数CreateData(A,m);printf("测试数据构造完成\n");GetLocalTime(&sys0); RadixSort(A,m);GetLocalTime(&sys1); //打印数据,在数据规模大的情况下很慢/*n=0;for(i=0;i<m;i++){printf("%d\t",A[i]);n++;if(n==10) {printf("\n");n=0;}}printf("\n");*/DispTime(sys0);DispTime(sys1);printf("用时:%s\n",DiffTime(sys1,sys0));free(A);
}