用python完成排序算法
排序算法总结
冒泡排序
相邻两个元素,两两循环比较,每趟筛选出一个最大或者最小的元素(有序区在后面)
def bubble_sort(data):
# 第一层循环:循环一次,代表一趟,并筛选出一个最大或最小元素
for i in range(len(data)-1):
temp = True
# 第二层循环:循环一次,表示相邻两个元素进行了一次比较
for j in range(len(data)-1-i):
if data[j] > data[j+1]:
# 相邻两个元素进行替换
data[j], data[j+1] = data[j+1], data[j]
temp = False
if temp:
return
选择排序
将一个元素设为初始值(一般都是第一个值),循环后面每个元素与第一个元素比较,最终筛选出一个最小或最大值(有序区在前面)
def select_sort(data):
# 第一层循环:取出数组中的每个元素
for i in range(len(data)):
temp = i # 拿取一个元素用来比较
# 第二层循环:从第i后面的一个值开始循环,与data[i]进行比较
for j in range(i+1,len(data)):
if data[j] < data[temp]:
data[temp], data[j] = data[j], data[temp]
插入排序
将第一个元素作为有序区的元素,从无序区取出一个元素与有序区元素进行逐个比较,并加入到有序区,依次循环
def insert_sort(data):
# 第一层循环: 从第二个元素开始循环取出元素,与有序区元素进行比较
for i in range(1,len(data)):
temp = data[i]
j = i-1
while j>=0 and temp < data[j]:
data[j+1] = data[j] # i = j+1
j = j-1 # 在与前面一个元素进行比较,所以j需要减1
# 当j = -1 就跳出循环,将temp值赋给第一个值,即data[0]
data[j+1] = temp
快速排序
取第一个元素p,使元素p归位(需要建立归位函数);
列表(数组)被P分成两部分,左边都比P小,右边都比P大;
递归完成排序。
总结就分成两部分:整理 + 递归
# 归位函数,定位中间值P
def partition(data,left,right):
temp = data[left]
while left < right:
# 如果最右边的值大于中间值,则最右边值往后退一个位置,反之,就将值赋值给最左边位置
while left < right and data[right] >= temp:
right = right - 1
data[left] = data[right]
# 如果最左边的值小于中间值,则最左边值往前进一个位置,反之,就将值赋值给最右边位置
while left < right and data[left] <= temp:
left = left + 1
data[right] = data[left]
# 循环结束,即可定位到中间位置,将初始值,赋值到这个位置
data[left] = temp
return left
def quick_sort(data,left,right):
if left< right:
mid = partition(data,left,right)
quick_sort(data,left,mid)
quick_sort(data,mid+1,right)
冒泡、选择、插入的时间复杂度为O(n^2);
快速排序的时间复杂度为O(nlogn)
希尔排序
希尔排序是一种分组插入排序算法
首先,取一个d1 = n // 2的整数,将元素分为d1个组,每组相邻元素之间的距离为d1,在各组内进行直接插入排序;
然后,取第二个整数d2 = d1 // 2,重复上述分组排序过程,直到d1 = 1,再将所有元素在同一组内直接插入排序。
希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序;最后一趟排序使得所有数据有序。
def shell_sort(data):
gap = len(data) // 2
while gap > 0:
for i in range(gap,len(data)):
temp = data[i]
j = i - gap
while j >= 0 and temp < data[j]:
data[j+gap] = data[j]
j = j-gap
data[j+gap] = temp
gap /= 2
希尔排序的时间复杂度为:O((1+T)n) 约等于 O(1.3n)
计数排序
新增一个值全部为0的列表(数组),再利用enumerate得到该列表的索引和值来排序;
def count_sort(data):
count = [0 for _ in range(len(data)+1)]
for i in data:
count[i] += 1
data.clear()
for index, nums in enumerate(count):
for j in range(nums):
data.append(index)
用python完成排序算法的更多相关文章
- Python之排序算法:快速排序与冒泡排序
Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...
- python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序
说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...
- python常见排序算法解析
python——常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- Python实现排序算法之快速排序
Python实现排序算法:快速排序.冒泡排序.插入排序.选择排序.堆排序.归并排序和希尔排序 Python实现快速排序 原理 首先选取任意一个数据(通常选取数组的第一个数)作为关键数据,然后将所有比它 ...
- python 经典排序算法
python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...
- Python 实现排序算法
排序算法 下面算法均是使用Python实现: 插入排序 原理:循环一次就移动一次元素到数组中正确的位置,通常使用在长度较小的数组的情况以及作为其它复杂排序算法的一部分,比如mergesort或quic ...
- python——常见排序算法解析
算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序, ...
- python之排序算法
排序是每个语言都需要学会的,不管是c++.java还是python,套路都是类似的 python中也有自带的排序函数sort,直接使用也可 闲来无事写了几个排序算法,各不相同 1.每次遇到最小的数都交 ...
- Python 八大排序算法速度比较
这篇文章并不是介绍排序算法原理的,纯粹是想比较一下各种排序算法在真实场景下的运行速度. 算法由 Python 实现,用到了一些语法糖,可能会和其他语言有些区别,仅当参考就好. 测试的数据是自动生成的, ...
随机推荐
- PAT 乙级 1032.挖掘机技术哪家强 C++/Java
题目来源 为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 1 的正整数 N,即参赛人数.随后 ...
- Mac下搭建Appnium+Python+Ios模拟器环境
转载:https://www.jianshu.com/p/f7cf077d9444 https://blog.csdn.net/a158123/article/details/79684499 htt ...
- USACO Milk Routing
洛谷 P3063 [USACO12DEC]牛奶的路由Milk Routing 洛谷传送门 JDOJ 2334: USACO 2012 Dec Silver 3.Milk Routing JDOJ传送门 ...
- iview form表单数值类型校验「iview自定义form表单校验器」
摘录iview表单验证 Form 组件基于 sync-validator 实现的数据验证,给 Form 设置属性 rules,同时给需要验证的 FormItem 设置属性 prop 指向对应字段即可. ...
- RabbitMQ六种队列模式-工作队列模式
前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列 [本文]RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...
- 12 opencv图像合成
#include < stdio.h > #include < opencv2\opencv.hpp > #include < opencv2\stitching.hpp ...
- plv8 中使用 eval 函数执行表达式计算
在js 开发中我们都说eval 函数是邪恶的,但是此函数也有好多妙用,以下是几个简单的案例 eval 执行基于js 的表达式计算 比如我们有以下表 CREATE TABLE rules ( id ...
- ajax有哪些方法可以实现跨域?他们都有哪些局限性?
1.服务器端代理:在服务器端设置一个代理,由服务器端向跨域下的网站发出请求,再将请求结果返回给前端. 属于后端的技术,实现起来最麻烦. 2.jsonP,只支持get方式调用. 3.XHR2(cors) ...
- 【线段树】【P5522】[yLOI2019] 棠梨煎雪
C [yLOI2019] 棠梨煎雪 Background 岁岁花藻檐下共将棠梨煎雪 自总角至你我某日辗转天边 天淡天青 宿雨沾襟 一年一会信笺却只见寥寥数言 --银临<棠梨煎雪> Desc ...
- nodejs内存溢出 FATAL ERROR: CALL_AND_RETRY_0 Allocation failed – process out of memory
spa项目整体迁移转为ssr后,改动之后部署一切还好,就是突然有一天访问人数太多,node进程很容易就挂了自动重启. 最后经过压力测试,考虑到是堆内存溢出的问题,就报错误:FATAL ERROR: C ...