一、基数排序

  局限:只能处理整数,且位数不能太大。

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

算法----其他排序相关推荐

  1. 排序算法---选择排序(java版)

    简单选择排序 原理 选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间.但是选择排序每次会从排序区间中找到最小的元素,将其放到已排序区间的末尾. 简单选择排序执 ...

  2. JavaScript实现十种经典排序算法(js排序算法)

    冒泡排序算法 冒泡排序(Bubble Sort)是一种简单直观的排序算法.冒泡排序算法的步骤描述如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一 ...

  3. C语言基础排序算法-选择排序

    C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...

  4. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  5. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)

    我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...

  6. C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序

    常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...

  7. Java入门算法(排序篇)丨蓄力计划

    本专栏已参加蓄力计划,感谢读者支持 往期文章 一. Java入门算法(贪心篇)丨蓄力计划 二. Java入门算法(暴力篇)丨蓄力计划 三. Java入门算法(排序篇)丨蓄力计划 四. Java入门算法 ...

  8. 经典排序算法 - 鸡尾酒排序Cocktail sort

    经典排序算法 - 鸡尾酒排序Cocktail sort 鸡尾酒排序基于冒泡排序,双向循环 还是看例子吧,给定待排数组[2 3 4 5 1] 第一趟过去时的每一步 第一步迭代,2 < 3不换 [2 ...

  9. ( 设计高效算法 ) 年龄排序 Age Sort Uva 11462

    ( 设计高效算法 ) 年龄排序 Age Sort Uva 11462 可以使用整数排序法, 内存太小无法堆排序. #include <cstdio> #include <cstrin ...

  10. python算法题排序_python-数据结构与算法- 面试常考排序算法题-快排-冒泡-堆排-二分-选择等...

    算法可视化网站推荐---->visualgo 0.面试题中的排序算法 一些排序算法可能在工作中用的会比较少,但是面试却是不得不面对的问题.算法有助于提高我们对数据结构的理解以及提高自己的逻辑能力 ...

最新文章

  1. ganglia 监控mysql_Ganglia监控MySQL
  2. 软件工程技术基础-(软件复用技术)
  3. 有关SwfUpLoad的2038 错误
  4. 芯片设计抽象层及其设计风格
  5. 关于Qt Designer程序/UI文件打开未响应的解决方法
  6. JAVA_OA(六):SpringMVC拦截器
  7. lenovo vantage工具栏无反应 电池图标单击无法显示状态栏
  8. React鼠标右单击事件
  9. ProgressBar 类
  10. 根据字符串自动构造对应类
  11. 学姐面了美团阿里京东的面经
  12. jQuery UI加入效果
  13. 云南省电子计算机高级,计算机基础知识-云南省电子信息高级技工学校.ppt
  14. Windows的同步I/O和异步I/O
  15. Code First开发系列之数据库迁移
  16. voip语音中转服务器,基于VoIP的语音应用服务器的设计与实现
  17. h5学习笔记:写一个小表格
  18. linux scsi程序,Linux scsi设备读写流程
  19. java excel 打勾_在excel中如何打钩
  20. AID Learning 0.87F3安装注意事项

热门文章

  1. Atiitt 自我学习法流程 1.预先阶段 1.1.目标搜索 资料搜索 1.2. 1.3.通过关联关键词 抽象 等领域 拓展拓宽体系树 1.4. 2.分析整理阶段 2.1.找出重点 压缩要学会
  2. Atitit 技术趋势的管理之道 attilax著 1. 技术趋势 即是新特性 3 1.1. 几个大趋势 3 1.2. 可读性大于性能趋势 3 2. 趋势来源渠道 4 2.1. 技术趋势Thought
  3. Atitti 过程导向 vs 结果导向 attilax的策略
  4. Atitit。sql2016标准化的规划方案 v3 q2a
  5. Julia :vscode jupyter中更新Julia kernel版本
  6. 重磅预告!企业上云的正确姿势
  7. 【人脸识别】基于matlab GUI形态学教室人数统计(带面板)【含Matlab源码 1703期】
  8. 【火灾检测】基于matlab GUI火灾检测(带面板)【含Matlab源码 1646期】
  9. 毕设题目:Matlab表盘识别
  10. 【MDVRP】基于matlab水滴算法求解多仓库车辆路径规划问题【含Matlab源码 1310期】