算法思想

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

算法步骤

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

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

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

算法实现

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

对于正数

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

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

对于负数

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

  取得当前位

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

算法实现

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

    Routing In the previous tutorial we built a simple logging system. We were able to broadcast log mes ...

  2. vue中webpack的配置理解

    当我们需要和后台分离部署的时候,必须配置config/index.js: 用vue-cli 自动构建的目录里面  (环境变量及其基本变量的配置) var path = require('path') ...

  3. mysql性能优化随笔

    mysql性能优化是一个很大的命题,这里只记录一下近期的一些小经验. 曾经以为看了点create table时加index的语法就觉得自己知道怎么做mysql优化了,后来又看了点介绍mysql索引底层 ...

  4. MyBatis Plus 将查询结果封装到指定实体

    MyBatis Plus 将查询结果封装到指定实体 思路 自定义方法,使用Wrapper,自定义映射结果集 Mapper接口 package com.mozq.boot.mpsand01.dao; i ...

  5. Graph Embedding Review:Graph Neural Network(GNN)综述

    作者简介: 吴天龙  香侬科技researcher 公众号(suanfarensheng) 导言 图(graph)是一个非常常用的数据结构,现实世界中很多很多任务可以描述为图问题,比如社交网络,蛋白体 ...

  6. linux下找到JVM占用资源最高的线程

    linux的top命令不仅可以看线程的资源占用,还可以看进程下线程的资源占用,结合对应的java命令可以定位到具体有问题的Java代码,以找出占用CPU最高的线程为例: 第一步: 通过 top命令查找 ...

  7. MacbookPro升级10.15 Catalina之后无法读写NTFS

    冲着Sidecar的双屏功能,乐呵呵的跑去升级了10.15,结果就悲剧了. 所有移动硬盘和U盘都写不了,无奈只好上网找办法,目前找到一个便宜的方法: 共2步: Step 1:编写fstab文件 使用T ...

  8. Linux性能优化实战学习笔记:第三十四讲

    一.上节回顾 上一节,我带你学习了 Linux 网络的基础原理.简单回顾一下,Linux 网络根据 TCP/IP模型,构建其网络协议栈.TCP/IP 模型由应用层.传输层.网络层.网络接口层等四层组成 ...

  9. 逗号表达式(c)

    #include <stdio.h> #include <stdlib.h> int main(void) { ; ; printf(" %d\n ", a ...

  10. Intellij IDEA使用一 创建javaweb项目并配置tomcat

    一.新建Java web项目 参考:https://blog.csdn.net/chengtengfei352/article/details/79211619 1.点击创建新项目 2. 3.crea ...