python写几个排序算法
def maopao(data: list):
"""
两两比较
:param data:
:return:
"""
length = len(data)
for i in range(length - 1):
flag = True
for j in range(length - 1 - i):
if data[j] > data[j + 1]:
data[j], data[j + 1] = data[j + 1], data[j]
flag = False
print(i, data)
if flag:
break
def choice(data: list):
"""
对未排序的元素中选出最小值替换到当前位置
:param data:
:return:
"""
length = len(data)
for i in range(length - 1):
min_index = i
for j in range(i + 1, length):
if data[j] < data[min_index]:
min_index = j
data[i], data[min_index] = data[min_index], data[i]
print(i, data)
def insert(data: list):
"""
从第二个元素开始,跟左边的所有元素比较,找到它比左边元素小的地方,把它从原位置插入到这个地方
:param data:
:return:
"""
length = len(data)
for i in range(1, length):
# 找到合适的位置
for j in range(i):
if data[i] < data[j]:
data.insert(j, data.pop(i))
print(i - 1, data)
def quick(data: list):
"""
从数组中选择一个元素称之为中轴元素,然后把数组中所有小于中轴元素的元素放在其左边,
所有大于或等于中轴元素的元素放在其右边,显然,此时中轴元素所处的位置的是固定的,也就是说,我们无需再移动中轴元素的位置。
从中轴元素那里开始把大的数组切割成两个小的数组(两个数组都不包含中轴元素),
接着我们通过递归的方式,让中轴元素左边的数组和右边的数组也重复同样的操作,
直到数组的大小为1,此时每个元素都处于有序的位置。
:param data:
:return:
"""
if not data:
return []
length = len(data)
tmp = data[0]
small = []
big = []
i = 0
times = 0
while times < length:
if data[i] < tmp:
small.append(data.pop(i))
elif data[i] > tmp:
big.append(data.pop(i))
else:
i += 1
times += 1
return quick(small) + data + quick(big)
def mergesort(seq: list):
"""
先把一个序列从中间分开,然后把两个序列再次分开,直到只有一个元素为止,
然后两两排序合并,再四四排序合并,再八八排序合并...最后合并到一起
"""
def merge(left, right):
result = [] # 新的已排序好的列表
i = 0 # 下标
j = 0
# 对两个列表中的元素 两两对比。
# 将最小的元素,放到result中,并对当前列表下标加1
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result
if len(seq) <= 1:
return seq
mid = len(seq) // 2 # 将列表分成更小的两个列表
# 分别对左右两个列表进行处理,分别返回两个排序好的列表
left_list = mergesort(seq[:mid])
right_list = mergesort(seq[mid:])
# 对排序好的两个列表合并,产生一个新的排序好的列表
return merge(left_list, right_list)
def heapsort(seq: list):
def make_heap(data: list):
"""
把数组变成一个大顶堆.
:param data:
:return:
"""
length = len(data)
# 遍历所有的父结点位置,从后往前遍历
for parentNode in range(length // 2 - 1, -1, -1):
while True:
# 当前节点的左子节点
sonNode = parentNode * 2 + 1
if sonNode >= length:
break
# sonNode+1 是右子节点
# 若右子节点在最后一个节点之前,并且右子节点比左子节点大,把孩子指针移到右子节点上,这样就可以交换更大的数
if (sonNode + 1 <= length - 1) and (data[sonNode + 1] > data[sonNode]):
sonNode += 1
if data[parentNode] < data[sonNode]:
data[sonNode], data[parentNode] = data[parentNode], data[sonNode]
else:
break
# 依次取出第0项,然后重建堆
result = []
length = len(seq)
for end in range(length):
make_heap(seq)
result.append(seq.pop(0))
return result
if __name__ == '__main__':
import random
source = [random.randint(0, i) for i in range(5, 999)]
# source = [6, 5, 7, 2, 11, 4, 10, 2, 5, 3, 1, 9, 6, 4]
print('-', source)
# maopao(source)
# choice(source)
# insert(source)
# print(mergesort(source))
sorts = source.copy()
sorts.sort(reverse=True)
aa = heapsort(source)
print(sorts == aa)
python写几个排序算法的更多相关文章
- 一篇夯实一个知识点系列--python实现十大排序算法
写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...
- Python实现的选择排序算法原理与用法实例分析
Python实现的选择排序算法原理与用法实例分析 这篇文章主要介绍了Python实现的选择排序算法,简单描述了选择排序的原理,并结合实例形式分析了Python实现与应用选择排序的具体操作技巧,需要的朋 ...
- Python实现一些常用排序算法
一些常用的排序 #系统内置排序算法#list.sort()#heapq模块 def sys_heap_sort(list): import heapq heap = [] for i in range ...
- 自己写的JS排序算法
这学期刚刚学完数据结构,之前就自己写了一点东西,现在整理一下. <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- python 十大经典排序算法
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选 ...
- Python十大经典排序算法
现在很多的事情都可以用算法来解决,在编程上,算法有着很重要的地位,将算法用函数封装起来,使程序能更好的调用,不需要反复编写. Python十大经典算法: 一.插入排序 1.算法思想 从第二个元素开始和 ...
- Python版常见的排序算法
学习笔记 排序算法 目录 学习笔记 排序算法 1.冒泡排序 2.选择排序 3.插入排序 4.希尔排序 5.快速排序 6.归并排序 7.堆排序 排序分为两类,比较类排序和非比较类排序,比较类排序通过比较 ...
- python实现经典的排序算法
排序 关注公众号"轻松学编程"了解更多. 1.冒泡排序 基本思想:比较相邻的元素大小,将小的前移,大的后移,就像水中的气泡一样,最小的元素经过几次移动,会最终浮到水面上.原地排序, ...
- C++/Python冒泡排序与选择排序算法详解
冒泡排序 冒泡排序算法又称交换排序算法,是从观察水中气泡变化构思而成,原理是从第一个元素开始比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较,就仿佛气泡逐渐从水底逐渐冒升到水面一样. ...
随机推荐
- linux帮助手册(help/man/info)
linux本身有数据库(数据库名whatis)--man实际是从whatis数据库里查找信息. makewhatis 刚装系统,若man不能用,用makewhatis命令.整理whatis数据库. 当 ...
- ceph unfound objects 处理
ceph Vol 45 Issue 1 1.unfound objects blocking cluster, need help! Hi, I have a production cluster o ...
- Math.floor(Math.random() * array.length),splice
1.Math.floor(Math.random() * array.length) 返回长度内的索引 eg: changeLimit () { function getArrayItems(arr, ...
- [原题复现][极客大挑战 2019]HardSQL(updatexml报错注入)
简介 原题复现: 考察知识点:SQL注入(报错注入,绕过过滤) 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台 特别感谢!) 榆林学院内可使用信安协会内部的CTF训练平 ...
- 插件Spire.PDF帮你高效搞定PDF打印
Spire.PDF介绍 Spire.PDF是一个专业的PDF组件,能够独立地创建.编写.编辑.操作和阅读PDF文件,支持 .NET.Java.WPF和Silverlight.Spire.PDF的PDF ...
- 新鲜出炉!凭借着这份面试宝典,我终于拿下了字节跳动的offer!
前言 我做Java也十来年了,现在也算是中层管理,每次招聘都需要找一些面试题,干脆自己整理了一份,这份面试宝典是从我 去年开始收集的,一方面是给公司招聘用,另一方面也是想用它,来挖掘自己在 Java ...
- 如何用CDR做出毛笔字效果
不仅仅是水墨字,毛笔字在CDR中的制作也是很简单的.一般来讲,水墨字其实跟毛笔字有相通之处,也可以说毛笔字是水墨字的一种,在CDR中的实现也是既简单又实用的. 方法一:艺术笔工具 艺术笔工具是比较便捷 ...
- 关于String类的一些知识点
//原链接:https://blog.csdn.net/songylwq/article/details/7297004 String str=new String("abc"); ...
- SwiftUI:看我展示52张扑克牌,“很快啊!”
目录 思路 效果图 相关代码解析 枚举创建扑克牌号码 枚举创建扑克牌类型 viewModel逻辑 UI实现 源码 感受 思路 使用 SwiftUI 创建 UI 结构: 使用 swift 的枚举和结构体 ...
- SPG-Net: Segmentation Prediction and Guidance Network for Image Inpainting
SPG-Net: Segmentation Prediction and Guidance Network for Image Inpainting pytorch 引言 利用语义分割获取空洞的边缘信 ...