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冒泡排序与选择排序算法详解
冒泡排序 冒泡排序算法又称交换排序算法,是从观察水中气泡变化构思而成,原理是从第一个元素开始比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较,就仿佛气泡逐渐从水底逐渐冒升到水面一样. ...
随机推荐
- cephonebox发布
前言 现在已经是2016年收官的一个月了,之前一直想做一个calamari的集成版本,之所以有这个想法,是因为,即使在已经打好包的情况下,因为各种软件版本的原因,造成很多人无法配置成功,calamar ...
- [LeetCode题解]21. 合并两个有序链表 | 递归
解题思路 使用递归实现: 定义函数功能:合并两个有序链表,并返回链表的头 结束条件:两个链表其中一个为空,返回另一个链表 递推公式: l1.val < l2.val:l1.next = Merg ...
- ACCESS渗透测试
access-getshell 直接写shell # 创建临时表 create table test(a varchar(255)); # 插入一句话木马 insert into test(a) va ...
- mysql学习笔记1(mysql的基本架构)
mysql基本架构图 如图所示: 1 . MySQL 可以分为 Server 层和存储引擎层两部分 Server 层包括连接器.查询缓存.分析器.优化器.执行器等,涵盖 MySQL 的大多数核心服务功 ...
- 开始使用 java8 的日期工具类
例如,现有的类(例如java.util.Date和SimpleDateFormatter)不是线程安全的,这会导致用户潜在的并发问题.而新的LocalDate.LocalDateTime.DateTi ...
- Spring Boot第一天
1.首先在idea中创建一个maven项目,创建成功后在pom.xml中添加SpringBoot相关的依赖 <!--引入SpringBoot相关的依赖--> <parent> ...
- Java命令行启动jar包更改默认端口以及配置文件的几种方式
Java命令行启动jar包更改默认端口以及配置文件的几种方式 java -jar xxx.jar --server.port=8081 默认如果jar包没有启动文件,可以采用这种方式进行启动 java ...
- 【Flutter 实战】酷炫的开关动画效果
此动画效果是我在浏览文章时发现的一个非常酷炫的效果,于是就使用 Flutter 实现了. 更多动画效果及Flutter资源:https://github.com/781238222/flutter-d ...
- iOS 百度地图使用详解
最近仿照美团做了款应用,刚好用到百度地图,高德地图之前用的比较多,只是这个项目的后台服务器是另外一个公司做的,他们用的就是百度地图,现在网上用百度地图的还不算太多,博文也是断断续续的,主要是中间跳跃有 ...
- 一万三千字的HashMap面试必问知识点详解
目录 概论 Hasmap 的继承关系 hashmap 的原理 解决Hash冲突的方法 开放定址法 再哈希法 链地址法 建立公共溢出区 hashmap 最终的形态 Hashmap 的返回值 HashMa ...