基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数

基数排序 vs 计数排序 vs 桶排序

这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:

基数排序:根据元素的每位数字来分配桶;

计数排序:每个桶只存储单一键值;

桶排序:每个桶存储一定范围的数值;

基数排序动图演示

image

#include

#include

#include

#include

#include

//定义基数为10进制

#define radix 10

//交换数值

void swap(int *a,int *b)

{

int temp = *a;

*a = *b;

*b = temp;

}

//打印数组

void printArray(char msg[],int arr[],int len){

printf("%s:",msg);

for (int i = 0; i < len; i++){

printf("%d ", arr[i]);

}

printf("\n");

}

//基数排序

void radix_sort(int a[],int len){

int maxvalue=a[0],minvalue=a[0];

for(int x=0;x

maxvalue=a[x]>maxvalue?a[x]:maxvalue;

minvalue=a[x]

}

int* temp = (int*)malloc(len*sizeof(int));

//获取最大位数

int n=1;

int d = maxvalue-minvalue;

while(d>=10){

d=d/10;

n++;

}

printf("总遍历位数:%d,最小值:%d,最大值:%d\n",n,minvalue,maxvalue);

//要获取的位

int divide=1;

for(int i=1;i<=n;i++){

//初始化计数器

int counter[radix]={0};

for(int j=0;j

//找出a[j]相对minvalue值的对应的位divide的值

int pos = ((a[j]-minvalue)/divide)%radix;

//a[j]换算成计数器数组下标pos并自增

counter[pos]++;

}

//使用累加(counter[n]=counter[n]+counter[n-1],有点类似斐波那契数列)计算出元素所在位置,保证结果有序

for(int j=1;j<10;j++){

counter[j]=counter[j]+counter[j-1];

}

//倒序遍历数组a,可以保持结果稳定性

for(int j=len-1;j>=0;j--){

//将a[j]映射到计数器下标pos,counter[pos]就是a[j]在新数组的位置

int pos=((a[j]-minvalue)/divide)%radix;

//获取元素位置mappos,--counter[pos]:每放一个元素到数组temp,counter[pos]值自减,保证结果稳定有序

int mappos=(--counter[pos]);

temp[mappos]=a[j];

}

//把temp有序数组赋值给a

for(int j=0;j

a[j]=temp[j];

}

printf("遍历位数%d:\n",divide);

for(int j=0;j

printf("a[%d]=%d,a[%d]-%d=%d\n",j,a[j],j,minvalue,a[j]-minvalue);

}

printf("\n");

//获取数值的下个位,比如个位数,下个是十位数

divide=divide*radix;

}

free(temp);

}

int main()

{

int len=10;

int arr[len];

srand((unsigned)time(NULL));

//随机生成长度为"len"的数组

for(int i=0;i

arr[i]=rand()%200;

}

printArray("未排序前",arr,len);

radix_sort(arr,len);

printArray("基数排序",arr,len);

//防止windows下控制台窗口闪退

int s;

scanf("%d",&s);

return 0;

}

运行结果:

未排序前:126 36 76 198 65 172 107 3 53 60

总遍历位数:3,最小值:3,最大值:198

遍历位数1:

a[0]=3,a[0]-3=0

a[1]=53,a[1]-3=50

a[2]=65,a[2]-3=62

a[3]=126,a[3]-3=123

a[4]=36,a[4]-3=33

a[5]=76,a[5]-3=73

a[6]=107,a[6]-3=104

a[7]=198,a[7]-3=195

a[8]=60,a[8]-3=57

a[9]=172,a[9]-3=169

遍历位数10:

a[0]=3,a[0]-3=0

a[1]=107,a[1]-3=104

a[2]=126,a[2]-3=123

a[3]=36,a[3]-3=33

a[4]=53,a[4]-3=50

a[5]=60,a[5]-3=57

a[6]=65,a[6]-3=62

a[7]=172,a[7]-3=169

a[8]=76,a[8]-3=73

a[9]=198,a[9]-3=195

遍历位数100:

a[0]=3,a[0]-3=0

a[1]=36,a[1]-3=33

a[2]=53,a[2]-3=50

a[3]=60,a[3]-3=57

a[4]=65,a[4]-3=62

a[5]=76,a[5]-3=73

a[6]=107,a[6]-3=104

a[7]=126,a[7]-3=123

a[8]=172,a[8]-3=169

a[9]=198,a[9]-3=195

基数排序:3 36 53 60 65 76 107 126 172 198

基数字符串排序c语言,基数排序(C语言)相关推荐

  1. 经典排序算法之基数排序(C语言版)

    排序算法之基数排序的C语言实现. #include "math.h" #include "stdio.h"/* * 基数排序 2016-04-18 23:43: ...

  2. R语言使用str_order函数和str_sort函数对字符向量进行排序(str_order返回字符串排序的次序值(索引)、str_sort返回排序后的字符串)

    R语言使用str_order函数和str_sort函数对字符向量进行排序(str_order返回字符串排序的次序值(索引).str_sort返回排序后的字符串) 目录

  3. 字符串排序-C语言实例

    1.简单的字符串排序 给定有限个字符串,将其按照大小顺序排列.此时的大小顺序简单来说我们可以先认为是ASCLL码的大小顺序.由此我们只需要比较字符串的ASCLL码的大小即可. 2.算法设计 1.输入1 ...

  4. 基于c语言实现 字符串排序

    基于c语言实现 字符串排序 一.简单的字符串排序 举例实现 题目 代码 一.简单的字符串排序 给定有限个字符串,将其按照大小顺序排列. 此时的大小顺序简单来说我们可以先认为是ASCLL码的大小顺序.由 ...

  5. C语言编程之字符串排序

    问题描述:使用C语言编程实现对字符串排序. 程序源码: #include<stdio.h> void main() { char *str1[20],*str2[20],*str3[20] ...

  6. 字符串排序(C语言实现)

    习题8-7 字符串排序(C语言实现) 方法一:选择排序 #include <stdio.h> #include <string.h> void sort(char c[][81 ...

  7. python如何给字符串排序_Python语言字符串排序方法

    本文主要向大家介绍Python语言字符串排序方法了,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 一般情况下,python中对一个字符串排序相当麻烦:一.python中的字符串类 ...

  8. c语言字符串字典序,字符串排序数组C语言 C语言 字符串数组字典排序

    C语言 字符串数组字典排序 #include #include int main() { int j,k,i,t,n; char s[10][10],b[10][10]; for(i=0;i c语言, ...

  9. (C语言)八大排序之:基数排序

    reference: 基数排序 http://blog.csdn.net/hitwhylz/article/details/9970451 八大排序 https://www.cnblogs.com/R ...

最新文章

  1. python报错:ModuleNotFoundError: No module named ‘tkinter‘ 解决办法
  2. python 单点登录_清华园计算机系联合推出的Java+Python视频曝光
  3. 前端取消置顶功能_短说开发日报:首页推荐频道刷新后首页置顶的数据没有加载出来的问题已修复(9.22周二)...
  4. (数据库系统概论|王珊)第十章数据库恢复技术:习题
  5. 为你的.NET/Mono应用程序加入更新支持NetSparkle
  6. 职业学校计算机教学总结报告,中职计算机教师教学工作总结(共6篇) .docx
  7. java实现奖学金申请,基于ssm+mysql的web助学金申请系统[实现过程记录]
  8. 51单片机汇编编程--16位拉幕灯
  9. R语言绘制bivariate polar plots
  10. solidworks曲面圆角与特征圆角区别与误用
  11. mysql 5.6 配置ssl_MySQL 5.6使用 SSL 连接
  12. matlabrobert锐化_Matlab图像处理系列3———空间域锐化滤波器
  13. nginx正向代理——实现上网功能
  14. 空间中直线与直线之间的位置关系
  15. MPI实现求解10的八次方内素数的个数(版本一)
  16. IT前端开发和后端开发
  17. OpenGL深入探索——像素缓冲区对象 (PBO)
  18. 力扣---2020.10.6
  19. 西门子PLC1200学习之硬件接线
  20. 京东C2M的“马桶故事”

热门文章

  1. 【云计算】云计算从业者导学
  2. Python编程基础:第五十四节 排序Sort
  3. Python编程基础:第四十六节 super函数Super Function
  4. JAVA enum实现简单状态机功能
  5. 1到1亿的自然数,求所有数的拆分后的数字之和
  6. 注释驱动的 Spring cache 缓存介绍--转载
  7. CatBoost讲解
  8. 二值化每个特征,微软用1350亿参数稀疏神经网络改进搜索结果
  9. 职场中晋升最快的人具有什么特点?隐藏不住的四大特征
  10. 信用评分如何应用在风控策略中(二)