算法----其他排序
一、基数排序
局限:只能处理整数,且位数不能太大。
import random from timewrap import *def list_to_buckets(li, iteration):#这个是用来比较每个位置的大小的数字"""因为分成10个本来就是有序的所以排出来就是有序的。:param li: 列表:param iteration: 装桶是第几次迭代:return:"""buckets = [[] for _ in range(10)]print('buckests',buckets)for num in li:digit = (num // (10 ** iteration)) % 10buckets[digit].append(num)print(buckets)return bucketsdef buckets_to_list(buckets):#这个是用来出数的return [num for bucket in buckets for num in bucket]# li = []# for bucket in buckets:# for num in bucket:# li.append(num) @cal_time def radix_sort(li):maxval = max(li) # 10000it = 0while 10 ** it <= maxval:#这个是循环用来,在以前一次排序的基础上在排序。li = buckets_to_list(list_to_buckets(li, it))it += 1return li# li = [random.randint(0,1000) for _ in range(100000)] li = [random.randint(0,10) for _ in range(10)] li=[5555,5525,9939,9999,6,3,8,9] s=radix_sort(li) print(s)
二、希尔排序
思路:
- 希尔排序是一种分组插入排序算法。
- 首先取一个整数d1=n/2,将元素分为d1个组,每组相邻量元素之间距离为d1,在各组内进行直接插入排序;
- 取第二个整数d2=d1/2,重复上述分组排序过程,直到di=1,即所有元素在同一组
- 希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序;最后一趟排序使得所有数据有序。
代码实现、
def insert_sort(li):#插入排序for i in range(1, len(li)):# i 表示无序区第一个数tmp = li[i] # 摸到的牌j = i - 1 # j 指向有序区最后位置while li[j] > tmp and j >= 0:#循环终止条件: 1. li[j] <= tmp; 2. j == -1li[j+1] = li[j]j -= 1li[j+1] = tmpdef shell_sort(li):#希尔排序 与插入排序区别就是把1变成dd = len(li) // 2while d > 0:for i in range(d, len(li)):tmp = li[i]j = i - dwhile li[j] > tmp and j >= 0:li[j+d] = li[j]j -= dli[j+d] = tmpd = d >> 1li=[5,2,1,4,5,69,20,11] shell_sort(li) print(li)
希尔排序的复杂度特别复杂,取决于d,分组的长度二、位移运算符
三、计数排序:
统计每个数字出现了几次
#计数排序 # 0 0 1 1 2 4 3 3 1 4 5 5 import random import copy from timewrap import *@cal_time def count_sort(li, max_num = 100):count = [0 for i in range(max_num+1)]for num in li:count[num]+=1li.clear()for i, val in enumerate(count):for _ in range(val):li.append(i)@cal_time def sys_sort(li):li.sort()li = [random.randint(0,100) for i in range(100000)] li1 = copy.deepcopy(li) count_sort(li) sys_sort(li1)
计数排序这么快,为什么不用计数排序呢?因为他是有限制的,你要知道列表中的最大数
如果一下来了一个很大的数,比如10000,那么占的空间就的这么大,
计数排序占用的空间和列表的范围有关系
解决这种问题的方法,可以用桶排序,都放进去可以在进行其他的排序。比如插入排序。
四、桶排序
在计数排序中,如果元素的范围比较大(比如在1到1亿之间),如何改造算法?
桶排序,首先将将元素分在不同的桶中,在对每个桶中的元素排序。
多关键字排序
先对十位进行排序,再根据 十位进行排序
要用两个函数,一个用来装桶,一个用来出桶
默认10个桶,找到个位,十位,分别放在对应的桶里的位置
桶排序的表现取决于数据的分布。也就是需要对不同数据排序时采取不同的分桶策略。
平均情况时间复杂度:O(n+k)
最坏情况时间复杂度:O(n+k)
空间复杂度:O(nk)
先分成若干个桶,桶内用插入排序。
例子
1:给两个字符串S和T,判断T是否为S的重新排列后组成的单词:
s="anagram",t="nagaram",return true
s='cat',t='car',return false
代码如下:
s = "anagram" t = "nagaram"def ss(s,t):return sorted(list(s))==sorted(list(t)) y=ss(s,t) print(y)
2、‘’
二维的坐标变成一维的坐标
X*b +y =i
(x,y) ->i
i//n----》x
i%n---->n
1 def searchMatrix(matrix, target): 2 m = len(matrix) 3 # print('m', m) 4 if m == 0: 5 return False 6 n = len(matrix[0]) 7 if n == 0: 8 return False 9 low = 0 10 high = m * n - 1 11 # print('high',high) 12 while low <= high: 13 mid = (low + high) // 2 14 x, y = divmod(mid, n) 15 if matrix[x][y] > target: 16 high = mid - 1 17 elif matrix[x][y] < target: 18 low = mid + 1 19 else: 20 return True 21 else: 22 return False 23 24 25 s = [ 26 [1, 2, 3], 27 [4, 5, 6], 28 [7, 8, 9] 29 ] 30 # print(searchMatrix(s, 1)) 31 # print(searchMatrix(s, 2)) 32 # print(searchMatrix(s, 3)) 33 # print(searchMatrix(s, 4)) 34 # print(searchMatrix(s, 5)) 35 # print(searchMatrix(s, 6)) 36 print(searchMatrix(s, 7)) 37 # print(searchMatrix(s, 8)) 38 # print(searchMatrix(s, 9))
View Code
3.给定一个列表和一个整数,设计算法找两个数的小标,使得两个数之和为给定的整数。保证肯定仅有一个结果。
例如:列表[1,2,5,4]与目标整数3,1+2=3,结果为(0,1)
方式一:
方式二:
方式三
方式四和三一样
def twoSum(num, target):dict = {}for i in range(len(num)):print(dict)x = num[i]if target - x in dict:return dict[target - x], idict[x] = il = [1, 2, 5, 4] print(twoSum(l, 7))
转载于:https://www.cnblogs.com/TheLand/p/9250691.html
算法----其他排序相关推荐
- 排序算法---选择排序(java版)
简单选择排序 原理 选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间.但是选择排序每次会从排序区间中找到最小的元素,将其放到已排序区间的末尾. 简单选择排序执 ...
- JavaScript实现十种经典排序算法(js排序算法)
冒泡排序算法 冒泡排序(Bubble Sort)是一种简单直观的排序算法.冒泡排序算法的步骤描述如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一 ...
- C语言基础排序算法-选择排序
C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...
- 在Object-C中学习数据结构与算法之排序算法
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...
- 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)
我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...
- C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序
常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...
- Java入门算法(排序篇)丨蓄力计划
本专栏已参加蓄力计划,感谢读者支持 往期文章 一. Java入门算法(贪心篇)丨蓄力计划 二. Java入门算法(暴力篇)丨蓄力计划 三. Java入门算法(排序篇)丨蓄力计划 四. Java入门算法 ...
- 经典排序算法 - 鸡尾酒排序Cocktail sort
经典排序算法 - 鸡尾酒排序Cocktail sort 鸡尾酒排序基于冒泡排序,双向循环 还是看例子吧,给定待排数组[2 3 4 5 1] 第一趟过去时的每一步 第一步迭代,2 < 3不换 [2 ...
- ( 设计高效算法 ) 年龄排序 Age Sort Uva 11462
( 设计高效算法 ) 年龄排序 Age Sort Uva 11462 可以使用整数排序法, 内存太小无法堆排序. #include <cstdio> #include <cstrin ...
- python算法题排序_python-数据结构与算法- 面试常考排序算法题-快排-冒泡-堆排-二分-选择等...
算法可视化网站推荐---->visualgo 0.面试题中的排序算法 一些排序算法可能在工作中用的会比较少,但是面试却是不得不面对的问题.算法有助于提高我们对数据结构的理解以及提高自己的逻辑能力 ...
最新文章
- ganglia 监控mysql_Ganglia监控MySQL
- 软件工程技术基础-(软件复用技术)
- 有关SwfUpLoad的2038 错误
- 芯片设计抽象层及其设计风格
- 关于Qt Designer程序/UI文件打开未响应的解决方法
- JAVA_OA(六):SpringMVC拦截器
- lenovo vantage工具栏无反应 电池图标单击无法显示状态栏
- React鼠标右单击事件
- ProgressBar 类
- 根据字符串自动构造对应类
- 学姐面了美团阿里京东的面经
- jQuery UI加入效果
- 云南省电子计算机高级,计算机基础知识-云南省电子信息高级技工学校.ppt
- Windows的同步I/O和异步I/O
- Code First开发系列之数据库迁移
- voip语音中转服务器,基于VoIP的语音应用服务器的设计与实现
- h5学习笔记:写一个小表格
- linux scsi程序,Linux scsi设备读写流程
- java excel 打勾_在excel中如何打钩
- AID Learning 0.87F3安装注意事项
热门文章
- Atiitt 自我学习法流程 1.预先阶段 1.1.目标搜索 资料搜索 1.2. 1.3.通过关联关键词 抽象 等领域 拓展拓宽体系树 1.4. 2.分析整理阶段 2.1.找出重点 压缩要学会
- Atitit 技术趋势的管理之道 attilax著 1. 技术趋势 即是新特性	3 1.1. 几个大趋势	3 1.2. 可读性大于性能趋势	3 2. 趋势来源渠道	4 2.1. 技术趋势Thought
- Atitti 过程导向 vs 结果导向 attilax的策略
- Atitit。sql2016标准化的规划方案 v3 q2a
- Julia :vscode jupyter中更新Julia kernel版本
- 重磅预告!企业上云的正确姿势
- 【人脸识别】基于matlab GUI形态学教室人数统计(带面板)【含Matlab源码 1703期】
- 【火灾检测】基于matlab GUI火灾检测(带面板)【含Matlab源码 1646期】
- 毕设题目:Matlab表盘识别
- 【MDVRP】基于matlab水滴算法求解多仓库车辆路径规划问题【含Matlab源码 1310期】