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冒泡排序与选择排序算法详解
冒泡排序 冒泡排序算法又称交换排序算法,是从观察水中气泡变化构思而成,原理是从第一个元素开始比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较,就仿佛气泡逐渐从水底逐渐冒升到水面一样. ...
随机推荐
- Docker这么火爆。章节一:带你详尽了解Docker容器的介绍及使用
前言 很多小伙伴可能在工作中都听说过Docker,但是实际工作中却没有使用过,听得多了,也对Docker内心有一种很深切的想了解,但是因为各种原因而不知道如何去了解而发愁,不要急,这篇文章带你认识Do ...
- mac用户怎么保护自己的隐私安全?
使用过Windows系统的小伙伴们应该都知道,Windows系统下有360电脑管家和腾讯电脑管家等几款著名清理软件,专门用于清理电脑缓存.垃圾文件以及清除浏览痕迹,这对于Windows用户是大大节省了 ...
- 蓝桥杯-RP大冒险-未解决
RP大冒险 问题描述 请尽情使用各种各样的函数来测试你的RP吧~~~ 输入格式 一个数N表示测点编号. 输出格式 一个0~9的数. 样例输入 0 样例输出 X {当且仅当输出仅有一个数X且X为0~9的 ...
- 为什么学完C语言觉得好像没学一般?
不少同学从Hello world学到文件操作之后,回顾感觉会又不会? 学会了又感觉没学会?这种不踏实.模糊虚无的感觉? 原因在于编程不同于理论学科,你听懂和理解了理论就可以运用. 比如历史地理,看 ...
- 一次SQL注入导致的"越权"
原文来自SecIN社区-作者:tkswifty 相关背景 在实际的业务开发中,SQL交互往往是业务系统中不可或缺的一项.在Java中提供了类似Mybatis.Hibernate.SpringDat ...
- python—数据类型和变量
在python中,能够直接处理的数据类型和变量有整数.浮点数.字符串.布尔值.空值.变量. 一.整数 1.python可处理任意大小的整数,包括负整数,在程序中的表示方法与在数学中的方法一样.例如:0 ...
- Alpha冲刺-第二次冲刺笔记
Alpha冲刺-冲刺笔记 这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE2 这个作业要求在哪里 https://edu.cnblogs. ...
- fist-冲刺第二天随笔
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...
- 雪花算法 Java 版
雪花算法根据时间戳生成有序的 64 bit 的 Long 类型的唯一 ID 各 bit 含义: 1 bit: 符号位,0 是正数 1 是负数, ID 为正数,所以恒取 0 41 bit: 时间差,我们 ...
- 20191012_WMI中可以看到有打印机, 设备管理器中没有
开发过程中使用SELECT * FROM Win32_Printer 查看设备有一个备份打印机, 并且被设置为默认打印机了, 但是设备管理器中没有 解决方法: 使用系统自带的测试WMI (Windo ...