算法思想

基数排序通过按位比较(一般从最低位开始)将元素按照最低位的数放到10个桶中,当所有的元素都这样被处理一次后,在按从0到9的顺序将每个桶的元素再取出来(不关注其他位的,只关注当前位的)这样就完成了所有元素最低位的有序性,然后不断的重复上面的步骤,知道所有元素的最高位都经过处理了。

算法步骤

初始化桶,共有10个,分别存放当前位位0-9的元素

从元素的最后一位开始,按照最后一位的数字将其放到相应的同元素中。对列表中的每个元素都进行上面的操作后,从0号桶开始,将元素从桶中取出来,这样就完成了一个位数的排序

重复上一过程,如果发现元素最高位已经被处理过,就把他添加到最终的结果中

算法实现

算法的主要问题在于对当前位的获取中

对于正数

  1. (element//divisor)%10#结果是当前位上的数#divisor代表当前位,个位是1,十位是10,百位是100#//是向下取整的意思

  如过element//divisor结果为0 就代表实际结果小于1了,即当前位已经是0了

对于负数

  1. collection[j]//i==-1#代表是负数

  取得当前位

  1. (10-math.ceil(element/divisor)%10)%10#math.ceil()是向上取整
  2. #最后一个%10是防止前面结果=10的情况出现

算法实现

  1. def radix_sort3(collection):
  2. ''' 考虑是否可以将负数通过abs转为正数来判断
  3. 外层循环控制进位,即先排最低位的,然后排倒数第二位的..一直处理到每个元素的最高位 ,最高为处理后,放到最终结果集中
  4. 内层循环控制数组元素的遍历
  5. 对每个数组元素,首先分大于0和小于0的两种情况,因为涉及到正数和负数的寻找最低位数字的算法逻辑大小不一样
  6. 对正数来说,分为当前进位后还有元素此时放到临时变量中,当前进位就是最后一位此时就放到最终的结果集中,相应的判断逻辑解释见版本0
  7. 负数也和上面差不多
  8. 在内层for结束以后,还需要将临时变量中的元素给取出来'''
  9. result_negative=[]
  10. result_positive=[]
  11. divisor=[pow(10,i) for i in range(10)]
  12. for i in divisor:
  13. bucket=[[] for j in range(10)]
  14. if len(collection)==0:
  15. break
  16. for j in range(len(collection)):
  17. if collection[j]//i>0:
  18. bucket[(collection[j]//i)%10].append(collection[j])
  19. continue
  20. elif collection[j]//i==0:
  21. result_positive.append(collection[j])
  22. continue
  23. #负数的
  24. # elif collection[j]//i<-1:
  25. # bucket[(10-math.ceil(collection[j]/i)%10)%10].append(collection[j])
  26. # continue
  27. # elif collection[j]//i==-1:#会出现bug,-100/100=-1,然后就被放到了最终结果中,但其实不应该被这样的
  28. # if math.ceil(collection[j]/i)==-1:
  29. # bucket[(10-math.ceil(collection[j]/i)%10)%10].append(collection[j])
  30. # continue
  31. # result_negative.insert(0,collection[j])
  32. # continue
  33. collection=[]
  34. for k in bucket:
  35. if k:
  36. collection.extend(k)
  37. return result_negative+result_positive

效率分析

时间复杂度:进行k次关于数位的循环,每次循环里还有一个循环,要对N个元素进行放桶,一共循环kN

对比

python排序 基数排序的更多相关文章

  1. python排序之二冒泡排序法

    python排序之二冒泡排序法 如果你理解之前的插入排序法那冒泡排序法就很容易理解,冒泡排序是两个两个以向后位移的方式比较大小在互换的过程好了不多了先上代码吧如下: 首先还是一个无序列表lis,老规矩 ...

  2. python排序之一插入排序

    python排序之一插入排序 首先什么是插入排序,个人理解就是拿队列中的一个元素与其之前的元素一一做比较交根据大小换位置的过程好了我们先来看看代码 首先就是一个无序的列表先打印它好让排序后有对比效果, ...

  3. 用 Python 排序数据的多种方法

    用 Python 排序数据的多种方法 目录 [Python HOWTOs系列]排序 Python 列表有内置就地排序的方法 list.sort(),此外还有一个内置的 sorted() 函数将一个可迭 ...

  4. 归并排序 & 计数排序 & 基数排序 & 冒泡排序 & 选择排序 ----> 内部排序性能比较

    2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...

  5. python排序算法实现(冒泡、选择、插入)

    python排序算法实现(冒泡.选择.插入) python 从小到大排序 1.冒泡排序: O(n2) s=[3,4,2,5,1,9] #count = 0 for i in range(len(s)) ...

  6. Python排序算法之选择排序定义与用法示例

    Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...

  7. 44.python排序算法(冒泡+选择)

    一,冒泡排序: 是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个,如果他们的排序错误就把他们交换过来. 冒泡排序是稳定的(所谓稳定性就是两个相同的元素不会交换位置) 冒泡排序算法的运作如下 ...

  8. Python排序搜索基本算法之归并排序实例分析

    Python排序搜索基本算法之归并排序实例分析 本文实例讲述了Python排序搜索基本算法之归并排序.分享给大家供大家参考,具体如下: 归并排序最令人兴奋的特点是:不论输入是什么样的,它对N个元素的序 ...

  9. python排序算法-冒泡和快速排序,解答阿里面试题

    ''常见的排序算法\ 插入排序/希尔排序/直接排序/堆排序 冒泡排序/快速排序/归序排序/基数排序 给定一个列表,将这个列表进行排序,要求:> 时间复杂度要小于O(n^2) 复杂度:1.时间复杂 ...

随机推荐

  1. Django的版本坑

    Django2.x与1.x版本之间的坑 App模块中models.py django2.x是中reverse使用方法 from django.urls import reverse ForeignKe ...

  2. 如何下载windows版的kubectl.exe文件

    github上的下载链接,不能直接下载. https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.14.md#client-b ...

  3. React中ref的三种用法 可以用来获取表单中的值 这一种类似document.getXXId的方式

    import React, { Component } from "react" export default class MyInput extends Component { ...

  4. E07【餐厅】What would you recommend?

    核心句型 What would you recommend? 你有什么推荐吗? 场景对话: A:What do  you  want  to  eat? 你想吃点什么? B:I don't know. ...

  5. 面向对象程序设计(java)

    201871010136-赵艳强<面向对象程序设计(java)>第二周学习总   第一部分:理论知识学习部分 一.简单的Java程序应运程序 1.标识符0标识符由字母.下划线.美元符号和数 ...

  6. slf4j 和 logback 的区别

    slf4j 和 logback 的区别: slf4j是Java的一个日志门面,实现了日志框架一些通用的api; logback是具体的日志框架.它和log4j是同一个作者,他是为了解决log4j存在的 ...

  7. Vue-cli 中安装并使用less

    首先安装vue-cli,网站教程多多,在这不多说.接下来在vue项目目录下,运行 其他扩展使用方法我放个官网链接,大家可以点击查看 npm install less less-loader --sav ...

  8. opencv归一化图像

    cv::normalize(src, dst, 0.0, 255.0, cv::NORM_MINMAX);

  9. python27期day17:re、logging日志模块、作业。

    1.re: 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中,并通过 re 模 ...

  10. Pycharm工具使用和安装

    1.安装包:https://pan.baidu.com/s/1O9JwuowlodhTR1m0VaKmhg 2.双击安装包安装: 3.选择安装目录 4.安装选项,Create Associations ...