深入浅出理解基数排序
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
每天一小步,成功一大步。大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习每天小知识。
以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。
摘要
本位主要讲述基数排序的主要思想和算法具体实现。
1. 算法思想
基数排序是一种稳定排序。
主要思想:
根据键的部分信息把元素放入到桶中。
把元素从桶中拿出来逐个放入到原数组中。
重复上述两个步骤,直到所有键的信息被全部使用。
时间复杂度:O(d(r+n))
2. 具体实现
具体实现以 对10个长度为5的英文单词进行按字典顺序排序为例。
一般步骤:
- 计算循环的次数。
- 确定桶的个数。
- 根据具体条件把元素放入到对应的桶中。
- 把元素从桶中拿出来放回原数组。
void card_sort(char str[10][6]){
int n = 5;//最大位数是5,只需要执行5次排序即可
while(n--){
//建立一个二维指针数组作为桶
char s[26][55];
int k[26] = {0};//每一个桶存放的字符串个数
//把每一个字符串,按照字符串最右侧字母大小放到桶里
for(int i = 0; i < N; i++){
int num = 0;
char ch = str[i][n];
//确定字母所在桶的位置
if(ch >= 'A' && ch <= 'Z'){
num = ch - 'A';
}
else if(ch >= 'a' && ch <= 'z'){
num = ch - 'a';
}
//找到桶之后,把字符串放到桶里
int pos = k[num]*5;
for(int j = 0; j < 5; j++){
s[num][pos++] = str[i][j];
}
k[num]++;
}
int q = 0;
//把桶中的字符串拿出来,赋值给原数组
for(int i = 0; i < 26; i++){
int t = 0;
for(int j = 0; j < k[i]; j++){
int p = 0;
for(int m = 0; m < 5; m++){
str[q][p++] = s[i][t++];
}
q++;
}
}
}
}
代码关键点:
- 确定循环次数
- 确定桶的位置
- 使用数组一行存多个字符串,因为这里字符串长度是5,可以根据这个来判断存了多少个字符串,以及下一个开始字符串存放的位置。
结语
以上就是我对基数排序的一些浅见,希望能对读者有所帮助,如有不正之处,欢迎掘友们批评指正。