八大排序算法的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:徐卜灵 #交换排序.快速排序 # 虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤.因此我的对快速排序作了进一步的说明: ...
随机推荐
- CVE-2017-8046(Spring Data Rest RCE)
环境搭建参考第一个链接,springboot启动文件如下,不同的启类,将Application.class修改一下就可以了,直接debug.注意:默认版本是2.0.3版本,修改成低版本,看一下mvn下 ...
- SpringMVC原理&MVC设计思想
什么是MVC? MVC是一种架构模式 --- 程序分层,分工合作,既相互独立,又协同工作 MVC是一种思考方式 --- 需要将什么信息展示给用户? 如何布局? 调用哪些业务逻辑? MVC流程图如下图所 ...
- QGIS里的编程模型
项目(QgsProject) 用于读写项目状态 图层分组(QgsLayerTreeGroup) 项目树的分组节点,用来存放图层节点. 图层节点(QgsLayerTreeLayer) 项目树的图层节点. ...
- leetcode-876 Middle of the Linked List
Given a non-empty, singly linked list with head node head, return a middle node of linked list. If t ...
- Python之字典的应用
# 转化为字符串 d = {'key1' : 'value1', 'key2 ': 'value2','key3' : 'value3'} s = str(d) print(s) #python3 结 ...
- Android failed to start daemon
异常描述:在Eclipse中运行Android项目时Console中出现: The connection to adb is down, and a severe error has occured. ...
- day34
今日内容: 1.开启子进程的两种方式 2.join方法 3.进程之间内存空间相互隔离 4.僵尸进程和孤儿进程 5.守护进程 6.互斥锁 7.进程对象其他相关的属性和方法 1.开启子进程的两种方式 方式 ...
- 再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结
1. 前言 bxCAN是STM32系列最稳定的IP核之一,无论有哪个新型号出来,这个IP核基本未变,可见这个IP核的设计是相当成熟的.本文所讲述的内容属于这个IP核的一部分,掌握了本文所讲内容,就可以 ...
- IC设计推荐书籍
IC设计推荐书籍 听语音 | 浏览:779 | 更新:2014-07-19 10:52 1 2 3 4 5 6 7 分步阅读 接触IC设计这一行已经有7年的时间了,前面4年是大学本科,用来学习知识,现 ...
- STS-使用前准备
sts 的基础框架拿的eclipse的,你可以理解为eclipse + spring插件的高级升华版.在使用上可以很大限度的参考eclipse的操作. 首先,调整字体. 中文很麻烦的,因为编码问题.习 ...