目录

一、算法思路

二、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);
}

【经典回放】多种语言系列数据结构算法:基数排序相关推荐

  1. 【经典回放】多种语言系列数据结构算法:栈(JavaScript版)

    本文采用JavaScript语言实现栈结构算法并举例应用. JavaScript的栈是数组对象中自动提供的,这点如同C#,实际也不需要自己编写什么栈的程序,如果你用: var s=new Array( ...

  2. 【经典回放】多种语言系列数据结构算法:归并排序

    目录 干货1:C#语言实现归并排序! 干货2:C语言实现归并排序! 干货1:C#语言实现归并排序! 一.算法 1.思想基础

  3. 【经典回放】多种语言系列数据结构算法:二叉树(C#版)

    实验任务描述 1 用C#语言完成二叉树的类.并构造出一个二叉树: 2 用递归方法完成二叉树的遍历: 3 泛型的二叉树遍历之一.用队列给出遍历结果 4 泛型的二叉树遍历之二.委托方式给出二叉树遍历结果 ...

  4. 【经典回放】多种语言系列数据结构算法:树(C#、JavaScript、VB6版)

    目    录 一.树的C#语言实现以及显示 二.树的JavaScript语言实现以及显示 三.树的VB6语言实现以及显示 一.树的C#语言实现以及显示 1

  5. 【经典回放】多种语言系列数据结构算法:串(C版)

    我们这里说的串.就是标准的C语言的串,这点,和我们教材中另行定义的串并不一致.我们这里强调仅仅是按C语言的标准处理串,是因为你会按C语言的标准构造串.而不是按其它的模式定义的.在我们的教材上,串相当与 ...

  6. 【经典回放】多种语言系列数据结构算法:队列(C版)

    一.队列ADT以及C语言实现 1 队列的原理以及ADT分析 队列是说:把一些数据按先进先出来组织,如同日常生活中的排队过程. 队列最主要的操作是 <1> 数据加入队列:<2> ...

  7. 【经典回放】多种语言系列数据结构算法:数组

    数组如同前面学过的顺序表,一次性申请一片地址连续的存储空间,我们还知道,计算机中数组是以一维的形式存储的,因为计算机的内存的一维的.在知道了多维数据的计算机存储方式后,我们还要知道构造一个多维数据的方 ...

  8. 【经典回放】多种语言系列数据结构算法:堆排序

    目录 一.堆排序算法分析 二.C#语言实现堆排序 三.C语言实现堆排序 一.堆排序算法分析

  9. 【经典回放】多种语言系列数据结构算法:快速排序

    快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1960年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另 ...

最新文章

  1. linux fdisk 分区、格式化、挂载
  2. 雷军旗下金山云冲刺IPO:3年营收74亿,小米系贡献23%,CEO王育林仅持股2.1%
  3. teach and learn
  4. rsa.FromXmlString 系统找不到指定的文件
  5. ORA-20000: ORU-10027: 执行存储过程的错误
  6. Extjs4前端开发代码规范参考
  7. 【XML】XML实例模板
  8. 微信内置浏览器调起外部浏览器打开指定网页连接
  9. JS规则 自加一,自减一 ( ++和- -) 【mynum = mynum + 1;//等同于mynum++;】
  10. 华为路由器第三方插件_为什么路由器不开 SSH 就等于失去了很多乐趣?
  11. SQLServer中替换某字段的部分内容
  12. oracle ogg是什么
  13. Zookeeper简介,架构,单机版搭建
  14. HTML5笔记(一)
  15. CDRshp文件转html,CDR转PDF设置教程-告诉你如何把cdr转换成适合印刷的pdf
  16. Jquery选择器:通过class名获取ID
  17. 郊区春游(状压DP水题)+ 记录路径
  18. python爬取陌生人的qq空间_Python爬取QQ空间好友说说并生成词云(超详细)
  19. 多线程加速图像模板匹配
  20. 进程和线程上下文切换_编码人员:上下文切换对于计算机和关系而言都很难

热门文章

  1. 思科3550 IOS
  2. .NET6之MiniAPI(十八):OpenAPI swagger
  3. 使用C#体验函数式编程之——Partial application(局部应用)
  4. 国产数据库占央采九成份额
  5. Blazor VS React / Angular / Vue.js
  6. IdentityServer4系列 | 资源密码凭证模式
  7. .Net Core中的诊断日志DiagnosticSource讲解
  8. 使用 Docker 搭建 PostgreSQL 12 主从环境
  9. 使用 postman 给 API 写测试
  10. MediatR-进程内的消息通信框架