# -*- 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实现的更多相关文章

  1. 八大排序算法的 Python 实现

    转载: 八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个 ...

  2. python基础===八大排序算法的 Python 实现

    本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...

  3. 八大排序算法---基于python

    本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 ...

  4. 八大排序算法的python实现(六)归并排序

    代码: #coding:utf-8 #author:徐卜灵 def merge(left,right): i,j = 0,0 result = [] while i < len(left) an ...

  5. 八大排序算法的python实现(三)冒泡排序

    代码: #coding:utf-8 #author:徐卜灵 #交换排序.冒泡排序 L = [1, 3, 2, 32, 5, 4] def Bubble_sort(L): for i in range( ...

  6. 八大排序算法的python实现(一)直接插入排序

    刚参考网上的以及书上的资料把这八大算法又复习了一遍,感悟就是:有些算法原理真的很简单,一看就懂,但实现起来总是有这样那样的问题. 闲言少叙,先贴代码,之后再以自己的理解,以及自己在理解与实现的过程中遇 ...

  7. 八大排序算法的python实现(二)希尔排序

    代码: #coding:utf-8 #author:徐卜灵 # 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. # 希尔排序,也称递减增量排序算法, ...

  8. 八大排序算法的python实现(八)简单选择排序

    代码: #coding:utf-8 #author:徐卜灵 # L = [6, 3, 2, 32, 5, 4] def Select_sort(L): for i in range(0,len(L)) ...

  9. 八大排序算法的python实现(五)堆排序

    代码 #coding:utf-8 #author:徐卜灵 # 堆排序适用于记录数很多的情况 #与快速排序,归并排序 时间复杂一样都是n*log(n) ######################### ...

  10. 八大排序算法的python实现(四)快速排序

    代码: #coding:utf-8 #author:徐卜灵 #交换排序.快速排序 # 虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤.因此我的对快速排序作了进一步的说明: ...

随机推荐

  1. ZOJ 4100 浙江省第16届大学生程序设计竞赛 A题 Vertices in the Pocket 线段树+并查集

    正赛的时候完全没看这个题,事后winterzz告诉我他想出来的解法. 首先题意是给出n个点,m次操作. 操作有一种是连接两个点,另一种是求此时再为这个图连k条边,最少和最多能有几个联通块. 最少的求法 ...

  2. Centos7常见问题及解决方法

    1,在Centos7中用MariaDB代替了mysql数据库 2,mysql报错:/usr/sbin/mysqld:unknown variable 'default-character-set=ut ...

  3. 启动报错:Access denied for user 'root'@'localhost' (using password:YES)

    项目启动报错:Access denied for user 'root'@'localhost' (using password:YES) 原因:root帐户默认不开放远程访问权限,所以需要修改一下相 ...

  4. 二分法php

    二分法.分别使用while循环的方法和递归调用的方法. <?php // 二分法的使用数组必须是有序的,或升序,或降序 $arr = array( 1, 3, 5, 7, 9, 13 ); // ...

  5. Mac软件推荐

    其他: AP文档浏览器+代码片段管理工具:Dash 抓包工具:Charles  使用教程:http://www.cnblogs.com/dsxniubility/p/4621314.html 音乐播放 ...

  6. UWP 下载文件显示下载进度

    <Page x:Class="WgscdProject.TestDownloadPage" xmlns="http://schemas.microsoft.com/ ...

  7. 赚钱的小生意,VC对你没兴趣

    创业者,赚钱的生意就不要去找VC(风险投资)了,因为人家对你的生意没有兴趣. 无论是创业者,VC,股权投资散户,都需要对一个"生意"的规模有个总体的认识. 就"生意&qu ...

  8. 洛咕 P3704 [SDOI2017]数字表格

    大力推式子 现根据套路枚举\(\gcd(i,j)\) \(ans=\Pi_{x=1}^nfib[x]^{\sum_{i=1}^{n/x}\sum_{j=1}^{n/x}[\gcd(i,j)=1]}\) ...

  9. 使用 Vue.js 2.0+ Vue-resource 模仿百度搜索框

    使用 Vue.js 2.0 模仿百度搜索框 <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

  10. [CF1083D]The Fair Nut’s getting crazy[单调栈+线段树]

    题意 给定一个长度为 \(n\) 的序列 \(\{a_i\}\).你需要从该序列中选出两个非空的子段,这两个子段满足 两个子段非包含关系. 两个子段存在交. 位于两个子段交中的元素在每个子段中只能出现 ...