# author:sevenduke
# 2019-06-11
# 一、交换排序
# 排序算法的温故:冒泡排序 def dubblesort(arr):
for i in range(0, len(arr)-1):
for j in range(0, len(arr) - 1 - i):
if arr[j] > arr[j+1]:
#Python的变量并不直接存储值,而只是引用一个内存地址,交换变量时,只是交换了引用的地址。
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
if __name__ == "__main__":
list = [1,5,3,45,2,34,46,100]
print("List source is:", list)
result = dubblesort(list)
print("List source is:", result)
# author:sevenduke
# 2019-06-11
# 一、交换排序
# 排序算法的温故:快速排序 def quickSort(arr, left = None, right = None):
left = 0 if not isinstance(left, (int, float)) else left
right = len(arr) - 1 if not isinstance(right, (int, float)) else right
# 可以 <= 不会错,但是程序多执行了许多次没必要的操作
if left < right:
partitionInex = parttion(arr,left,right)
quickSort(arr, left,partitionInex-1)
quickSort(arr, partitionInex+1, right)
return arr def parttion(arr, left, right):
pivot = left
position = left + 1
index = position
while index <= right:
if arr[index] < arr[pivot]:
swap(arr,index,position)
position += 1
index += 1
swap(arr,pivot,position-1)
print("List source is:", arr)
return position-1 def swap(arr, i, j):
arr[i], arr[j] = arr[j], arr[i] if __name__ == "__main__":
list = [2,42,53,23,34,290,2344,200,3500]
print("List source is:",list)
result = quickSort(list)
print("List source is:", result)
# author:sevenduke
# 2019-06-11
# 二、选择类排序
# 排序算法的温故:选择排序 def selectSort(arr):
for i in range(len(arr)-2):
minIndex = i
for j in range(i+1,len(arr)):
if arr[minIndex] > arr[j]:
minIndex = j
if i != minIndex:
swap(arr, i, minIndex)
return arr def swap(arr, i, j):
arr[i], arr[j] = arr[j], arr[i] if __name__ == "__main__":
list = [2, 42, 53, 23, 34, 290, 2344, 200, 3500]
print("List source is:", list)
result = selectSort(list)
print("List source is:", result)
import math
# author:sevenduke
# 2019-06-11
# 二、选择类排序
# 排序算法的温故:堆排序
# 堆排序分为以下两种:
#1、大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
#2、小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列; def bulitMaxHeap(arr):
for i in range(math.floor(len(arr)/2),-1,-1):
heapify(arr,i) def swap(arr, i, j):
arr[i], arr[j] = arr[j], arr[i] def heapify(arr, i):
left = i*2+1
right = i*2+2
position = i
if left < arrlen and arr[left] > arr[position]:
position = left
if right < arrlen and arr[right] > arr[position]:
position = right
if position != i:
swap(arr,i,position)
heapify(arr,position) def heapSort(arr):
global arrlen
arrlen = len(arr)
# 从大到小排序
bulitMaxHeap(arr)
# 变化为从小到大排序
for i in range(len(arr)-1,-1,-1):
swap(arr,0,i)
# 将当前可取的最大值拿到末尾
arrlen -= 1
heapify(arr,0)
return arr if __name__ == '__main__':
list = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
print("List source is:", list)
result = heapSort(list)
print("List sort is:", result)
# author:sevenduke
# 2019-06-11
# 三、插入类排序
# 排序算法的温故:插入排序 def insertSort(arr):
for i in range(len(arr)):
index = i
for j in range(i,len(arr)):
if arr[index] > arr[j]:
index = j
if(index != i):
swap(arr, i, index)
return arr def swap(arr, i, j):
arr[i], arr[j] = arr[j], arr[i] if __name__ == "__main__":
list = [2, 42, 53, 23, 34, 290, 2344, 200, 3500]
print("List source is:", list)
result = insertSort(list)
print("List source is:", result)
import math
# author:sevenduke
# 2019-06-11
# 三、插入类排序
# 排序算法的温故:希尔排序 def shellSort(arr):
incretment = 1
while(incretment < len(arr)/3):
incretment = incretment * 3 + 1
while incretment > 0:
for i in range(incretment, len(arr)):
temp = arr[i]
j = i - incretment
while j >= 0 and arr[j] > temp:
arr[j+incretment] = arr[j]
j -= incretment
arr[j+incretment] = temp
#incretment = int((incretment-1)/3)
incretment = math.floor(incretment/3)
return arr if __name__ == "__main__":
list = [2, 42, 53, 23, 34, 290, 2344, 200, 3500]
print("List source is:", list)
result = shellSort(list)
print("List source is:", result)
import math
# author:sevenduke
# 2019-06-11
# 四、归并类排序
# 排序算法的温故:归并排序 def mergeSort(arr):
import math
if len(arr) < 2:
return arr
midIndex = math.floor(len(arr)/2)
left, right = arr[0:midIndex], arr[midIndex:]
return merge(mergeSort(left),mergeSort(right))
def merge(left, right):
result = []
while left and right:
if left[0] < right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
while left:
result.append(left.pop(0))
while right:
result.append(right.pop(0))
return result
if __name__ == "__main__":
list = [34,24,53,2,43,54,657,3435,2423,231]
print("List source is:", list)
result = mergeSort(list)
print("List source is:", result)
import math
# author:sevenduke
# 2019-06-11
# 五、分布类类排序
# 排序算法的温故:计数排序
# 局限性:适用于有固定范围的排序
# 桶排序和计数排序本质一致,这里就不做介绍了 def countingSort(arr):
arrlen = max(arr)+1
result = [0]*arrlen
sortIndex = 0
# 将arr中的数据填入到result数组中
for i in range(len(arr)):
if not result[arr[i]]:
result[arr[i]] = 0
result[arr[i]] += 1 # 将result数组中的数据写入到arr中
for i in range(len(result)):
while result[i] > 0:
arr[sortIndex] = i
sortIndex += 1
result[i] -= 1
return arr if __name__ == "__main__":
list = [2,42,5234,24,243,236,76,767,565,45]
print("List source is:", list)
result = countingSort(list)
print("List source is:", result)
import math
# author:sevenduke
# 2019-06-11
# 五、分布类类排序
# 排序算法的温故:基数排序
# 局限性:适用于整数排序(推广到特定的浮点数,和字符串,以及日期) def redixSort(arr):
# 找到arr中的最大的位数
maxNumber = max(arr)
mN_len = len(str(maxNumber))
index = 0
while index < mN_len:
# 初始化二维数组
bucket_list = [[] for i in range(10)]
for elem in arr:
bucket_list[int(elem / (10**index) % 10)].append(elem)
arr.clear()
for elem in bucket_list:
for num in elem:
arr.append(num)
index += 1
return arr if __name__ == "__main__":
list = [2, 42, 53, 23, 34, 290, 2344, 200, 3500]
print("List source is:", list)
result = redixSort(list)
print("List source is:", result)

注:2019年6月份的计划是打算一边学习pyhton核心编程这本书,然后用python将以部分算法实现下,回顾下之前学过的内容。之前都在走项目这条路,但是过程中发现自己的写代码的思维跟不上大脑运作的思维,就是最近代码写得太少了。所以打算最近一段时间增强下自己的代码实现能力。这段时间的学习发现编程能力遇到了瓶颈,过分的依赖于别人写好的模板,然后拿去套用,没有掌握核心内容。鉴于应该是自己太想向着实践发展,忽视了自身思维的提升导致的。要开是刷leetcode了,争取每周刷20道题吧,加油!路小刀!

python实现十大核心算法(桶排没实例)的更多相关文章

  1. 一篇夯实一个知识点系列--python实现十大排序算法

    写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...

  2. 使用 js 实现十大排序算法: 桶排序

    使用 js 实现十大排序算法: 桶排序 桶排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  3. Python实现十大经典排序算法(史上最简单)。

    十大排序算法(Python实现)一. 算法介绍及相关概念解读 算法分类十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn), ...

  4. Python实现十大经典排序算法(史上最简单)

    十大排序算法(Python实现)一. 算法介绍及相关概念解读 算法分类十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn), ...

  5. python实现十大经典排序算法

    Python实现十大经典排序算法 代码最后面会给出完整版,或者可以从我的Githubfork,想看动图的同学可以去这里看看: 小结: 运行方式,将最后面的代码copy出去,直接python sort. ...

  6. 排序算法——(2)Python实现十大常用排序算法

    上期为大家讲解了排序算法常见的几个概念: 相关性:排序时是否需要比较元素 稳定性:相同元素排序后是否可能打乱 时间空间复杂度:随着元素增加时间和空间随之变化的函数 如果有遗忘的同学可以看排序算法——( ...

  7. JS的十大经典算法排序

    引子 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements JavaScript. 当年,想凭借抱Java大腿火一把而不惜把自己名字给改了的JavaScript(原名LiveScript ...

  8. 十大排序算法JavaScript实现总结

    花费了几周的时间断断续续的练习和模仿与使用JavaScript代码实现了十大排序算法. 里面有每种算法的动图和静态图片演示,看到图片可以自己先按照图片的思路实现一下. github中正文链接,点击查看 ...

  9. 十大排序算法总结(Python3实现)

    十大排序算法总结(Python3实现) 本文链接:https://blog.csdn.net/aiya_aiya_/article/details/79846380 目录 一.概述 二.算法简介及代码 ...

随机推荐

  1. python协程总结

    概述 python多线程中因为有GIL(Global Interpreter Lock 全局解释器锁 )的存在,所以对CPU密集型程序显得很鸡肋:但对IO密集型的程序,GIL会在调用IO操作前释放,所 ...

  2. 005.Kubernetes二进制部署kubectl

    一 部署 kubectl 1.1 安装kubectl [root@k8smaster01 ~]# cd /opt/k8s/work [root@k8smaster01 work]# wget http ...

  3. 一文带你深入了解 Redis 的持久化方式及其原理

    Redis 提供了两种持久化方式,一种是基于快照形式的 RDB,另一种是基于日志形式的 AOF,每种方式都有自己的优缺点,本文将介绍 Redis 这两种持久化方式,希望阅读本文后你对 Redis 的这 ...

  4. pat 1108 Finding Average(20 分)

    1108 Finding Average(20 分) The basic task is simple: given N real numbers, you are supposed to calcu ...

  5. nyoj 111-分数加减法 (gcd, switch, 模拟,数学)

    111-分数加减法 内存限制:64MB 时间限制:1000ms 特判: No 通过数:20 提交数:54 难度:2 题目描述: 编写一个C程序,实现两个分数的加减法 输入描述: 输入包含多行数据 每行 ...

  6. 力扣(LeetCode)Excel表列名称 个人题解

    给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> ...

  7. SpringBoot 配置文件与依赖库分离打包配置

    一.应用场景 一般情况下我们对springboot应用打包时使用springboot的maven插件spring-boot-maven-plugin的maven进行打包,打包完成得到一个fatjar, ...

  8. 使用boost实现线程池thread pool | boost thread pool example

    本文首发于个人博客https://kezunlin.me/post/f241bd30/,欢迎阅读! boost thread pool example Guide boost thread pool ...

  9. node后台初始配置(2)

    一.node-app结构 创建成功node-app项目后,会自动生成一些文件一般初始的结构如下图 在bin文件夹里面只有一个文件www      var port = normalizePort(pr ...

  10. 【Luogu P3388】割点模板

    Luogu P3388 在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合. 如果某个割点集合只含有一个顶点X(也即{X ...