八大排序算法的python实现
# -*- coding: utf-8 -*- # 冒泡排序
def bubble_sort(nums):
i = 1
exchanged = True
while i < len(nums) and exchanged:
exchanged = False
for j in range(len(nums) - i):
if nums[j] > nums[j + 1]:
nums[j], nums[j + 1] = nums[j + 1], nums[j]
exchanged = True
i += 1
return nums # 快速排序
def quick_sort(nums, left=0, right=None):
if right == None:
right = len(nums) - 1
if left >= right:
return nums
low = left
high = right
key = nums[left]
while left < right:
while left < right and nums[right] >= key:
right -= 1
nums[left], nums[right] = nums[right], nums[left]
while left < right and nums[left] <= key:
left += 1
nums[left], nums[right] = nums[right], nums[left]
quick_sort(nums, low, left - 1) # 递归
quick_sort(nums, right + 1, high) # left == right
return nums # 插入排序
def insert_sort(nuns):
for i in range(1, len(nums)):
key = nums[i]
i -= 1
while i >= 0 and nums[i] > key:
nums[i + 1] = nums[i]
i -= 1
nums[i + 1] = key
return nums # 希尔排序
def shell_sort(nums):
gap = len(nums) // 2 # 初始增量,//整除
while gap > 0:
# 缩小增量,直至增量为1
for i in range(0, gap):
# 分组
j = i + gap
while j < len(nums):
# 组内插入排序
key = nums[j]
k = j - gap
while k >= 0 and nums[k] > key:
nums[k + gap] = nums[k]
k -= gap
nums[k + gap] = key
j += gap
gap //= 2
return nums # 选择排序
def select_sort(nums):
for i in range(len(nums)):
minimum = i
for j in range(i + 1, len(nums)):
if nums[j] < nums[minimum]:
minimum = j
nums[i], nums[minimum] = nums[minimum], nums[i]
return nums # 堆排序
def max_heapify(nums, i, size):
# 最大堆调整
# 注意数组的size比数组的最大索引大1
lchild = 2 * i + 1
rchild = 2 * i + 2
maximum = i
if i < size // 2:
if nums[lchild] > nums[maximum]:
maximum = lchild
if rchild < size:
# 肯定有左子节点,未必有右子节点
if nums[rchild] > nums[maximum]:
maximum = rchild
if maximum != i:
nums[i], nums[maximum] = nums[maximum], nums[i]
max_heapify(nums, maximum, size) # 递归
def build_max_heap(nums, size):
# 创建最大堆
for i in range(size // 2 - 1, -1, -1):
max_heapify(nums, i, size)
def heap_sort(nums):
size = len(nums)
build_max_heap(nums, size)
for i in range(1, size):
nums[0], nums[size - i] = nums[size - i], nums[0]
max_heapify(nums, 0, size - i)
return nums # 归并排序
def merge_sort(nums):
length = len(nums)
if length <= 1:
return nums
list1 = merge_sort(nums[: length // 2])
list2 = merge_sort(nums[length // 2:]) # 递归
i = 0
j = 0
k = 0
while i < len(list1) and j < len(list2):
if list1[i] < list2[j]:
nums[k] = list1[i]
i += 1
k += 1
else:
nums[k] = list2[j]
j += 1
k += 1
nums = nums[: k] + list1[i:]
nums = nums[: k] + list2[j:] # 其中一个为空列表
return nums # 基数排序
def radix_sort(nums):
maximum = nums[0]
for num in nums:
# 找到最大值
if num > maximum:
maximum = num
k = 1
while maximum // (10 ** k) > 0:
# 判定最大值是几位数
k += 1
for i in range(k):
buckets = [[] for x in range(10)]
for num in nums:
buckets[(num // (10 ** i)) % 10].append(num)
nums = []
for b in buckets:
nums += b
return nums # 测试
nums0 = list(range(200))
nums = list(range(200))
random.shuffle(nums)
print(bubble_sort(nums) == nums0)
print(quick_sort(nums) == nums0)
print(insert_sort(nums) == nums0)
print(shell_sort(nums) == nums0)
print(select_sort(nums) == nums0)
print(heap_sort(nums) == nums0)
print(merge_sort(nums) == nums0)
print(radix_sort(nums) == nums0)
八大排序算法的python实现的更多相关文章
- 八大排序算法的 Python 实现
转载: 八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个 ...
- python基础===八大排序算法的 Python 实现
本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...
- 八大排序算法---基于python
本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 ...
- 八大排序算法的python实现(六)归并排序
代码: #coding:utf-8 #author:徐卜灵 def merge(left,right): i,j = 0,0 result = [] while i < len(left) an ...
- 八大排序算法的python实现(三)冒泡排序
代码: #coding:utf-8 #author:徐卜灵 #交换排序.冒泡排序 L = [1, 3, 2, 32, 5, 4] def Bubble_sort(L): for i in range( ...
- 八大排序算法的python实现(一)直接插入排序
刚参考网上的以及书上的资料把这八大算法又复习了一遍,感悟就是:有些算法原理真的很简单,一看就懂,但实现起来总是有这样那样的问题. 闲言少叙,先贴代码,之后再以自己的理解,以及自己在理解与实现的过程中遇 ...
- 八大排序算法的python实现(二)希尔排序
代码: #coding:utf-8 #author:徐卜灵 # 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. # 希尔排序,也称递减增量排序算法, ...
- 八大排序算法的python实现(八)简单选择排序
代码: #coding:utf-8 #author:徐卜灵 # L = [6, 3, 2, 32, 5, 4] def Select_sort(L): for i in range(0,len(L)) ...
- 八大排序算法的python实现(五)堆排序
代码 #coding:utf-8 #author:徐卜灵 # 堆排序适用于记录数很多的情况 #与快速排序,归并排序 时间复杂一样都是n*log(n) ######################### ...
- 八大排序算法的python实现(四)快速排序
代码: #coding:utf-8 #author:徐卜灵 #交换排序.快速排序 # 虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤.因此我的对快速排序作了进一步的说明: ...
随机推荐
- 数据同步canal服务端介绍
1.下载安装包 canal&github的地址,最权威的学习canal相关知识的地方 https://github.com/alibaba/canal 在下面的wiki列表中找到AdminGu ...
- OpenCV——Brisk特征检测、匹配与对象查找
检测并绘制特征点: #include <opencv2/opencv.hpp> #include <opencv2/xfeatures2d.hpp> #include < ...
- CSS属性书写顺序及命名规则
/* mozilla.org Base Styles * maintained by fantasai */ /* Suggested order: * display * list-style * ...
- ssh访问服务器端visdom
在服务器端启动visdompython -m visdom.server在windows端,将服务器的8097端口重定向到windows端(做了映射绑定):ssh -L 8097:127.0.0.1: ...
- C++之数据类型
C++语言是广泛使用的程序设计语言之一,因其特有的优势在计算机应用领域占有重要一席. C++中的数据类型 C++中的数据类型分为两大类:基本数据类型和非基本数据类型,如图1.1所示. 图1.1 C++ ...
- Apple 相关官方地址
https://developer.apple.com/download/more/ 证书制作地址: https://developer.apple.com/account/ios/profile/ ...
- 解决eth0网卡无法自动加载的问题
问题:输入ifup eth0显示无法加载网卡所在的文件 解决办法: vi /etc/rc.d/rc.local 最后一行加入: ifup eth0 然后重启虚拟机即可解决问题. 本文为博主原创文章,未 ...
- 大数据入门第二十二天——spark(一)入门与安装
一.概述 1.什么是spark 从官网http://spark.apache.org/可以得知: Apache Spark™ is a fast and general engine for larg ...
- WFP page navigator control
WPF navigator UI: <Grid x:Class="WpfApplication2.PagerNav" xmlns="http://schemas.m ...
- 20155202 张旭《网络对抗》Exp2 后门原理与实践
20155202 张旭<网络对抗>Exp2 后门原理与实践 基础问题回答 例举你能想到的一个后门进入到你系统中的可能方式? 捆绑在软件中 注入在可执行文件里 注入在office文件的宏里面 ...