深入浅出理解基数排序

228 阅读2分钟

深入浅出理解基数排序

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

 每天一小步,成功一大步。大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习每天小知识。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

 本位主要讲述基数排序的主要思想和算法具体实现。

1. 算法思想

基数排序是一种稳定排序。

主要思想:

根据键的部分信息把元素放入到桶中。

把元素从桶中拿出来逐个放入到原数组中。

重复上述两个步骤,直到所有键的信息被全部使用。

时间复杂度:O(d(r+n))

2. 具体实现

具体实现以 对10个长度为5的英文单词进行按字典顺序排序为例。

一般步骤:

  1. 计算循环的次数。
  2. 确定桶的个数。
  3. 根据具体条件把元素放入到对应的桶中。
  4. 把元素从桶中拿出来放回原数组。
 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++;                    
             }           
         }
     }    
 }

代码关键点:

  1. 确定循环次数
  2. 确定桶的位置
  3. 使用数组一行存多个字符串,因为这里字符串长度是5,可以根据这个来判断存了多少个字符串,以及下一个开始字符串存放的位置。

结语

以上就是我对基数排序的一些浅见,希望能对读者有所帮助,如有不正之处,欢迎掘友们批评指正。