八大排序算法的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:徐卜灵 #交换排序.快速排序 # 虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤.因此我的对快速排序作了进一步的说明: ...
随机推荐
- MyBatis实战之初步
关于MyBatis与Hibernate及其JDBC的比较,大家可以参考我的这篇文章:MyBatis+Hibernate+JDBC对比分析 如果觉得这个还不够系统全面,可以自行Google或者百度. 用 ...
- Vue 下拉列表 组件模板
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Android 给TextView中的字体加上“中间线”
大家都知道在做购物App或者购物网站的时候,商品价格往往会有一个“现价”和“原价”而原价往往会在中间加上一个黑色的横线.便于醒目客户,但是这种效果在App中应该怎样做呢? 废话不多少,直接给大家看代码 ...
- zabbix(2-server-agent)
注意:以下步骤都是在LAMP配置之后进行的. 关于LAMP环境的简单快速搭建,见博客:http://afterdawn.blog.51cto.com/7503144/1923139 下面开始介绍在Ce ...
- CAN总线学习总结——错误帧和错误状态
CAN总线学习总结——错误帧和错误状态 标签: 数据 / 错误帧 / 错误状态 / CAN总线 / 总线协议 253 一.五种CAN总线可能发生的错误 1.CRC错误: 接收节点计算出的CRC校验值, ...
- Java关键字(二)——native
本篇博客我们将介绍Java中的一个关键字——native. native 关键字在 JDK 源码中很多类中都有,在 Object.java类中,其 getClass() 方法.hashCode()方法 ...
- vue中的img src 动态加载本地json的图片路径写法。
目录: 注意:本地json文件和json文件里的图片地址都必须写在static 静态文件夹里:否则json文件里的url地址找不到. major_info.json文件里的图片路径写法 页面通过v-b ...
- Go语言安全编码规范-翻译(分享转发)
Go语言安全编码规范-翻译 本文翻译原文由:blood_zer0.Lingfighting完成 如果翻译的有问题:联系我(Lzero2012).匆忙翻译肯定会有很多错误,欢迎大家一起讨论Go语言安全能 ...
- 分类-MNIST(手写数字识别)
这是学习<Hands-On Machine Learning with Scikit-Learn and TensorFlow>的笔记,如果此笔记对该书有侵权内容,请联系我,将其删除. 这 ...
- Android开发——Android中的二维码生成与扫描
0. 前言 今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描.本篇旨在帮助有需求的同学快速完成二维 ...