算法学习笔记--基数排序
来源:互联网 发布:seo的岗位职责 编辑:程序博客网 时间:2024/05/09 21:21
基数排序
基数排序(Radix Sort)是对桶排序的改进和推广。
单关键字和多关键字
文件中任一记录R[i]的关键字均由d个分量
若这
多关键字中的每个关键字的取值范围一般不同。如扑克牌的花色取值只有4种,而点数则有13种。单关键字中每位一般取值范围相同。
基数
设单关键字的每个分量的取值范围均是:
基数的选择和关键字的分解因关键字的类型而异:
(1). 若关键字是十进制数,则按个、十等位进行分解,基数
(2). 若关键字是小写的英文字母,则
基数排序的基本思想
从低位到高位依次对
基数排序的排序过程
算法分析
时间是线性的(即
所需的辅助存储空间为(
基数排序是稳定的
代码实现
python
# -- coding: utf-8 --import math;import randomimport sysimport io# 解决 atom-script中文乱码问题sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')def radixsort(data): maxNumber = max(data) d = math.floor(math.log10(maxNumber)) buckets = list(map(lambda x:[], range(0,10))) j,m = 0,1 while j <= d: for num in data: i = num // m % 10 buckets[i].append(num) dataIndex = 0 for bucket in buckets: for bnum in bucket: data[dataIndex] = bnum dataIndex = dataIndex + 1 bucket.clear() j,m = j+1, m * 10 return datarand = lambda minval=0,maxval=1:minval + random.random() * (maxval-minval)arr = list(map(lambda x: int(rand(1, math.pow(10,rand(1,8)))), range(1,20)))print("排序前:%s"%arr)radixsort(arr)print("排序后:%s"%arr)
scheme(⊙﹏⊙)
(define digits (lambda (number) (if (< number 10) 1 (+ 1 (digits (/ number 10))) ) ))(define list-get! (lambda (data index) (cond ( (or (null? data) (< index 0)) #f ) ( (zero? index) (car data) ) (else (list-get! (cdr data) (- index 1)) ) ) ))(define list-set! (lambda (listv index value) (if (zero? index) (cons value (cdr listv)) (cons (car listv) (list-set! (cdr listv) (- index 1) value)) ) ))(define modulo (lambda ( divident divider) (- divident (* (floor (/ divident divider)) divider)) ))(define (list-reverse l) (if (null? l) (list) (append (list-reverse (cdr l)) (list (car l))) ))(define radix-sort (lambda (arr) (begin (define zip-buckets (lambda (data m buckets) (if (null? data) buckets (let ( (index (modulo (floor (/ (car data) m)) 10) ) ) (zip-buckets (cdr data) m (list-set! buckets index (cons (car data) (list-get! buckets index) ) ) ) ) ) ) ) (define unzip-buckets (lambda (buckets data) (if (not (null? buckets)) (unzip-buckets (cdr buckets) (append data (list-reverse (car buckets)))) data ) ) ) (define r-sort (lambda (data d j m) (if (< j d) (r-sort (unzip-buckets (zip-buckets data m (list (list) (list) (list) (list) (list) (list) (list) (list) (list) (list))) (list) ) d (+ j 1) (* m 10) ) data ) ) ) (r-sort arr (digits (apply max arr)) 0 1) ) ))(display (radix-sort (list 1048 79 276 158 31 15 23 2 0 345 )))
0 0
- 算法学习笔记--基数排序
- 算法导论学习笔记——基数排序
- 算法导论_基数排序学习笔记
- 算法笔记--基数排序
- 算法笔记八:基数排序
- 算法导论学习笔记(六):计数排序与基数排序
- 《算法导论》学习之基数排序
- 学习回顾算法(基数排序算法)
- 8大内部排序算法学习笔记--(4)归并、基数排序 Java实现
- 算法学习(七)——基数排序
- 基数排序算法
- 算法-----基数排序
- 基数排序算法
- 基数排序算法
- 基数排序算法
- 基数排序算法
- 算法--基数排序
- 基数排序算法
- 【poj 1185】【codevs 1647】炮兵阵地 状压动规
- JVM内存调优
- 女性在基因里就会计算大数据
- 摄像机穿墙时自动缩小距离
- mapper 的namespace必须设置
- 算法学习笔记--基数排序
- 蓝鸥Unity开发之C#入门视频课后习题汇总
- Java主流框架
- Interpolated Strings
- 赚钱必看:独立开发者必知的一些总结
- 浅谈IQKeyboardManager第三方库的使用
- 将单表600万的数据拆分到20张表的实现方法分享
- [深度学习论文笔记][Image Classification] Maxout Networks
- 隐藏<textarea>边框的方法