八大排序算法的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:徐卜灵 #交换排序.快速排序 # 虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤.因此我的对快速排序作了进一步的说明: ...
随机推荐
- JavaScript中的箭头函数
1.定义 箭头函数相当于匿名函数,并且简化了函数定义.箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ ... }和return都省略掉了.还有一种可以包含多条语句,这时候就不能省略{ ... ...
- (四)Lua脚本语言入门(数组遍历)
这篇文章就当成铺垫型的文章,写着写着发现有好多想写的,,关于C#与Java,当然作为铺垫肯定与Lua的下部分介绍有关..... 对于"泛型",先看C#中"泛型" ...
- vmware共享文件夹
环境: VMware Workstation 11.0 虚拟机中的系统:Ubuntu 16.04 物理机:window 7 安装好vmware tools后在 /mnt/hgfs 里没有东西,是空白的 ...
- php字符串替换的几个函数
strtr() str_replace() substr_replace() preg_replace() strtr()的用法: <?php $str = "test"; ...
- js中数组的使用
使用js时候,很多情况下要使用数组.就写写数组中一些常用的方法. js中定义一个数组,一般有以下2种方法. 1. var arr = new Array(3); // 声明数组有3个元素 arr[0] ...
- 开启Node.js的大门
其实也没什么好说的,简而言之,就是如何配置node.js环境,然后进行开发.博主最近比较堕落,觉得什么事情也没有就不知道想干什么,想融入一些事情又觉得没大神指引,于是自娱自乐开始自己玩node.js, ...
- 使用jdb调试apk
jdb是一个支持java代码级调试的工具,它是由java jdk提供的,存在于xxx\Java\jdk1.6.0_21\bin之下 使用ddms调试时,主机会打开另外一个网络端口,在DDMS里查看,一 ...
- 2017-2018-2 《网络对抗技术》20155322 Exp9 web安全基础
[-= 博客目录 =-] 1-实践目标 1.1-实践介绍 1.2-实践内容 1.3-实践要求 2-实践过程 2.1-HTML 2.2-Injection Flaws 2.3-XSS 2.4-CSRF ...
- C语言如何向系统接要存
C语言如何向系统接要存,就有这么三种方式: 1.向栈要. 2.向堆要. 3.向数据段要. 这一下就扯出了三种内存空间,内存空间的本质是一样的,一个地址对应一个方框,方框里可以放数据.但是为了更好的去 ...
- 【最详细最完整】在Linux 下如何打包免安装的QT程序?
在Linux 下如何打包免安装的QT程序? 版权声明:嵌入式linux相关的文章是我的学习笔记,基于Exynos 4412开发板,一部分内容是总结,一部分是查资料所得,大家可以自由转载,但请注明出处! ...