Python实现8中常用排序算法
L = [2,6,4,7,9,1,3,5,8] # 1.插入排序
def insert_sort(List):
n = len(List)
for i in range(1,n): # 得到索引
j = i-1 # 获取当前元素之前的索引
temp = List[i]
while j >= 0: # 当索引大于等于时开始循环
if temp < List[j]: # 当List[i]元素小于之前的元素
List[j+1] = List[j] # 交换两个元素的位置
List[j] = temp
j -= 1 # 继续比较交换后的list[i]和再前一个元素的大小,继续循环
return List print(insert_sort(L)) #2.冒泡排序
def bubble_sort(List):
n = len(List)
for i in range(n):
for j in range(i+1, n):
if List[i] > List[j]:
List[j], List[i] = List[i], List[j]
return List print(bubble_sort(L)) # 3.快速排序
def quick_sort(List,low,high):
i=low
j=high
if i >= j:
return List
key=List[i]
while i < j:
# 当高位游标大于基准值时, 高位游标向左移动
while i < j and List[j]>=key:
j = j - 1
List[i]=List[j]
# 当低位游标指向的值,小于基准值时, 低位游标向右移动
while i < j and List[i]<=key:
i = i + 1
List[j]=List[i]
List[i]=key
quick_sort(List,low,i-1) # 对基准值左边的未排序队列排序
quick_sort(List,j+1,high)# 对基准值右边的未排序队列排序
return List print(quick_sort(L, 0, len(L)-1)) #4.选择排序
def select_sort(List):
length = len(List)
for i in range(length): # 得出全部的索引
min_index=i # 假设最小的索引
for j in range(i,length): # 获取i之后的索引
if List[j]<List[min_index]:# 比较i 之后的元素与最小元素的大小
min_index=j # 如果小于最小元素,那么久交换索引
List[i],List[min_index]=List[min_index],List[i] # 交换最小的索引指向的值
return List print(select_sort(L)) #5.归并排序
def merge_sort(list):
if len(list)<=1:
return list
# 根据长度确定中间位置
mid = int(len(list)/2)
left=merge_sort(list[:mid])
right=merge_sort(list[mid:])
return merge(left,right) def merge(list1,list2):
list=[]
i,j=0,0
while i<len(list1) and j<len(list2):
if list1[i]<list2[j]:
list.append(list1[i])
i=i+1
elif list1[i]>=list2[j]:
list.append(list2[j])
j=j+1
list.extend(list1[i:])
list.extend(list2[j:])
return list print(merge_sort(L)) #6.希尔排序
def shell_sort(List):
step = int(len(List)/2)
while step > 0:
for i in range(step, int(len(List))):
while i >= step and List[i-step] > List[i]:
List[i], List[i-step] = List[i-step], List[i]
i -= step
step = int(step/2)
return List print(shell_sort(L)) # 7.堆排序
def adjust_heap(List, i, size):
lchild = 2 * i + 1
rchild = 2 * i + 2
m = i
if i < int(size/2) and List[lchild] > List[m]:
m = lchild
if rchild < size and List[rchild] > List[m]:
m = rchild
if m != i:
List[m], List[i] = List[i], List[m]
adjust_heap(List, m, size) def build_heap(List, size):
for i in range(0, int(size/2))[::-1]:
adjust_heap(List, i, size) def heap_sort(List):
size = len(List)
build_heap(List, size)
for i in range(0, size)[::-1]:
List[0], List[i] = List[i], List[0]
adjust_heap(List, 0, i)
return List print(heap_sort(L)) # 8.基数排序
import math
def radix_sort(List, radix=10):
n = int(math.ceil(math.log(max(List), radix)))
bucket = [[] for i in range(radix)]
for i in range(1, n + 1):
for j in List:
bucket[int(j/(radix**(i-1))) % (radix**i)].append(j)
del List[:]
for x in bucket:
List += x
del x[:]
return List print(radix_sort(L))
参考: https://www.cnblogs.com/wangbin2188/p/6520560.html
以上运行环境为: python3.7.0 win10
Python实现8中常用排序算法的更多相关文章
- 面试中常用排序算法实现(Java)
当我们进行数据处理的时候,往往需要对数据进行查找操作,一个有序的数据集往往能够在高效的查找算法下快速得到结果.所以排序的效率就会显的十分重要,本篇我们将着重的介绍几个常见的排序算法,涉及如下内容: 排 ...
- 面试中常用排序算法的python实现和性能分析
这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数学,但是自己还是比较讨厌繁琐的公式,所以基本上文章所有的逻辑,我都尽可能的用大白话 ...
- 排序算法——(2)Python实现十大常用排序算法
上期为大家讲解了排序算法常见的几个概念: 相关性:排序时是否需要比较元素 稳定性:相同元素排序后是否可能打乱 时间空间复杂度:随着元素增加时间和空间随之变化的函数 如果有遗忘的同学可以看排序算法——( ...
- 常用排序算法的python实现和性能分析
常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...
- Python实现常用排序算法
Python实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...
- 转载部长一篇大作:常用排序算法之JavaScript实现
转载部长一篇大作:常用排序算法之JavaScript实现 注:本文是转载实验室同门王部长的大作,找实习找工作在即,本文颇有用处!原文出处:http://www.cnblogs.com/ywang172 ...
- Java 常用排序算法/程序员必须掌握的 8大排序算法
Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...
随机推荐
- BZOJ 2048 2009国家集训队 书堆 数学算法
题目大意:经典的物理上的桌边堆书问题,初中物理老师以前还讲过,只是仅仅记住了结论. . . 没关系,简单证明一下就好 首先我们设由上至下第i本书比它以下那本书多伸出去的长度为a[i],前缀和为s[i] ...
- WPF学习笔记——DataContext 与 ItemSource
作为一个WPF新手,在ListBox控件里,我分不清 DataContext 与 ItemSource的区别. 在实践中,似乎: <ListBox x:Name="Lst" ...
- bzoj2132: 圈地计划(无比强大的最小割)
2132: 圈地计划 题目:传送门 简要题意: 给出一个矩阵,一共n*m个点,并给出三个收益矩阵.A矩阵表示这个点建A的可取收益,B矩阵表示这个点建B的可取收益,C矩阵表示如果相邻(有且仅有一条公共边 ...
- pattern matching is C# 7.0
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is 原来的版本 private static s ...
- bzoj 1191 [ HNOI 2006 ] 超级英雄Hero —— 二分图匹配
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1191 就是二分图匹配的裸题: 注意题目要求是第一次匹配失败就退出!没仔细看题差点丢失1A. ...
- PCB 奥宝LDI 输出正负片转换关系
今天继续对P2 奥宝LDI改造,在文件输出的时候遇到了一个正负片转换问题,研究了半天一直没有得到解决, 回来后前前后后整理今天参数输出与输出的关系,最终还梳理清楚了, 今天小结:一项技术只要用心去研究 ...
- git 设定全局ignore
创建: 2017/08/08 位置: $HOME/.config/git/ignore git/ignore 要自建 内容 https://github.com/github/gitignore ...
- EditPlus 2:用空格替换制表符
打开软件点击菜单栏上的Tools(工具),在点击perferences(外观),再点击左边栏的File->Setting & Syntax(文件->设置与符号),再点击右栏的Tab ...
- golang struct里面的字段,或者slice排序
accounts := []users.Account{}Admin.DB.Preload("CurrencyObj").Where("member_id = ?&quo ...
- java反射机制学习小结
之前一直对java的反射机制理解得很模糊,今天因为学习spring,所以花了些时间总算把它理顺了,记录一下 另外,推荐读读这篇文章,写的挺好的http://blog.csdn.net/woshixuy ...