python实现十大核心算法(桶排没实例)
# 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实现十大核心算法(桶排没实例)的更多相关文章
- 一篇夯实一个知识点系列--python实现十大排序算法
写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...
- 使用 js 实现十大排序算法: 桶排序
使用 js 实现十大排序算法: 桶排序 桶排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- Python实现十大经典排序算法(史上最简单)。
十大排序算法(Python实现)一. 算法介绍及相关概念解读 算法分类十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn), ...
- Python实现十大经典排序算法(史上最简单)
十大排序算法(Python实现)一. 算法介绍及相关概念解读 算法分类十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn), ...
- python实现十大经典排序算法
Python实现十大经典排序算法 代码最后面会给出完整版,或者可以从我的Githubfork,想看动图的同学可以去这里看看: 小结: 运行方式,将最后面的代码copy出去,直接python sort. ...
- 排序算法——(2)Python实现十大常用排序算法
上期为大家讲解了排序算法常见的几个概念: 相关性:排序时是否需要比较元素 稳定性:相同元素排序后是否可能打乱 时间空间复杂度:随着元素增加时间和空间随之变化的函数 如果有遗忘的同学可以看排序算法——( ...
- JS的十大经典算法排序
引子 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements JavaScript. 当年,想凭借抱Java大腿火一把而不惜把自己名字给改了的JavaScript(原名LiveScript ...
- 十大排序算法JavaScript实现总结
花费了几周的时间断断续续的练习和模仿与使用JavaScript代码实现了十大排序算法. 里面有每种算法的动图和静态图片演示,看到图片可以自己先按照图片的思路实现一下. github中正文链接,点击查看 ...
- 十大排序算法总结(Python3实现)
十大排序算法总结(Python3实现) 本文链接:https://blog.csdn.net/aiya_aiya_/article/details/79846380 目录 一.概述 二.算法简介及代码 ...
随机推荐
- python协程总结
概述 python多线程中因为有GIL(Global Interpreter Lock 全局解释器锁 )的存在,所以对CPU密集型程序显得很鸡肋:但对IO密集型的程序,GIL会在调用IO操作前释放,所 ...
- 005.Kubernetes二进制部署kubectl
一 部署 kubectl 1.1 安装kubectl [root@k8smaster01 ~]# cd /opt/k8s/work [root@k8smaster01 work]# wget http ...
- 一文带你深入了解 Redis 的持久化方式及其原理
Redis 提供了两种持久化方式,一种是基于快照形式的 RDB,另一种是基于日志形式的 AOF,每种方式都有自己的优缺点,本文将介绍 Redis 这两种持久化方式,希望阅读本文后你对 Redis 的这 ...
- pat 1108 Finding Average(20 分)
1108 Finding Average(20 分) The basic task is simple: given N real numbers, you are supposed to calcu ...
- nyoj 111-分数加减法 (gcd, switch, 模拟,数学)
111-分数加减法 内存限制:64MB 时间限制:1000ms 特判: No 通过数:20 提交数:54 难度:2 题目描述: 编写一个C程序,实现两个分数的加减法 输入描述: 输入包含多行数据 每行 ...
- 力扣(LeetCode)Excel表列名称 个人题解
给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> ...
- SpringBoot 配置文件与依赖库分离打包配置
一.应用场景 一般情况下我们对springboot应用打包时使用springboot的maven插件spring-boot-maven-plugin的maven进行打包,打包完成得到一个fatjar, ...
- 使用boost实现线程池thread pool | boost thread pool example
本文首发于个人博客https://kezunlin.me/post/f241bd30/,欢迎阅读! boost thread pool example Guide boost thread pool ...
- node后台初始配置(2)
一.node-app结构 创建成功node-app项目后,会自动生成一些文件一般初始的结构如下图 在bin文件夹里面只有一个文件www var port = normalizePort(pr ...
- 【Luogu P3388】割点模板
Luogu P3388 在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合. 如果某个割点集合只含有一个顶点X(也即{X ...