用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 实现,用到了一些语法糖,可能会和其他语言有些区别,仅当参考就好. 测试的数据是自动生成的, ...
随机推荐
- matplotlib 自带的几种美化样式
1.用 matplotlib.pyplot.style.avaliable 可查看 matplotlib 自带的美化样式如下: ['bmh', 'classic', 'dark_background' ...
- Pandas | 02 Series 系列
系列(Series)是能够保存任何类型的数据(整数,字符串,浮点数,Python对象等)的一维标记数组.轴标签统称为索引. pandas.Series Pandas系列可以使用以下构造函数创建 - p ...
- 为什么两个一样的对象,用===打印是false
对象的地址(变量名)存在栈中,对象的引用指向堆中,比较对象的时候,是比较对象的引用是否相等.obj和obj1的引用地址分别指向堆中的两块数据,所以不相等.
- gethostbyaddr
函数原型: #include<netdb.h> struct hostent * gethostbyaddr(const char *addr, socklen_t len, int fa ...
- Apache的代理服务器的配置 (正向代理 ,反向代理,轮询调度)
一. 代理服务器的了解1.代理服务器 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息. Squid是一个缓存Internet 数据的软件,其接收用户的下载申请,并自 ...
- 使用stunnle加密传输
Stunnel是一个可以用SSL对任意 TCP 连接加密的程序.它可以运行在多种UNIX和Windows上,它是基于 OpenSSL的,所以它要求已经安装了 OpenSSL,并进行了正确的配置.——来 ...
- Windows彻底卸载VMWare虚拟机详细步骤
不能卸载vmware ,原因是VMware的服务在运行中,停止服务就可以卸载了. 点击开始输入[services.msc],然后点击搜索到服务. 找到这个软件的图一的所有项,然后右键它属性. 全部设置 ...
- 【Activiti学习之八】Spring整合Activiti
环境 JDK 1.8 MySQL 5.6 Tomcat 8 idea activiti 5.22 activiti-explorer是官方提供的一个演示项目,可以使用页面管理Activiti流程.ac ...
- Maven 教程(18)— 利用 Profile 构建不同环境的部署包
原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79776257 接上回继续,项目开发好以后,通常要在多个环境部署,象我们公司多达5 ...
- Oracle 层次查询 connect by
oracle 层次查询 语法: SELECT ... FROM [WHERE condition] --过 ...