pyhton3 一些排序算法概括
1、冒泡算法
import random
import datetime def maopao(data):
# 检测是否排序完成
for i in range(len(data)-1):
flag = False
for j in range(len(data)-1-i):
if data[j]>data[j+1]:
data[j],data[j+1]=data[j+1],data[j]
flag = True
if not flag:
break return data test_data=list(range(1,100000))
random.shuffle(test_data) #打乱顺序
time1=datetime.datetime.now()
print(test_data) test_data=maopao(test_data)
time2=datetime.datetime.now() print(test_data,'readtime:',time2-time1)
如上排序了100000个乱序的数,耗时0:16:49.345000,性能有点差;
时间复杂度为O(N^2)
2、插入排序
import random
import datetime def insertSort(arr):
length = len(arr)
for i in range(1,length):
x = arr[i]
for j in range(i,-1,-1):
# j为当前位置,试探j-1位置
if x < arr[j-1]:
arr[j] = arr[j-1]
else:
# 位置确定为j
break
arr[j] = x
return arr test_data = list(range(100000))
random.shuffle(test_data)
time1=datetime.datetime.now()
print(test_data) test_data=insertSort(test_data)
time2=datetime.datetime.now()
print(test_data,'readtime:',time2-time1)
如上排序了100000个乱序的数,耗时 0:06:57.300000,性能一般般;
时间复杂度为:O(n^2/2)
3、归并算法
import random
import datetime def merge_sort(li):
#不断递归调用自己一直到拆分成成单个元素的时候就返回这个元素,不再拆分了
if len(li) == 1:
return li #取拆分的中间位置
mid = len(li) // 2
#拆分过后左右两侧子串
left = li[:mid]
right = li[mid:] #对拆分过后的左右再拆分 一直到只有一个元素为止
#最后一次递归时候ll和lr都会接到一个元素的列表
# 最后一次递归之前的ll和rl会接收到排好序的子序列
ll = merge_sort(left)
rl = merge_sort(right) # 我们对返回的两个拆分结果进行排序后合并再返回正确顺序的子列表
# 这里我们调用拎一个函数帮助我们按顺序合并ll和lr
return merge(ll,rl) #这里接收两个列表
def merge(left,right):
# 从两个有顺序的列表里边依次取数据比较后放入result
# 每次我们分别拿出两个列表中最小的数比较,把较小的放入result
result = []
while len(left)>0 and len(right)>0 :
#为了保持稳定性,当遇到相等的时候优先把左侧的数放进结果列表,因为left本来也是大数列中比较靠左的
if left[0] <= right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
#while循环出来之后 说明其中一个数组没有数据了,我们把另一个数组添加到结果数组后面
result += left
result += right
return result if __name__ == '__main__':
li = list(range(100000))
random.shuffle(li)
print(li)
time1=datetime.datetime.now()
li=merge_sort(li)
time2=datetime.datetime.now()
print(li,'readtime:',time2-time1)
如上排序了100000个乱序的数,耗时0:00:01.712000,性能还可以;
时间复杂度为:O(N*log(N))
4、快速排序
这个排序借鉴一下大佬的文章,原文:https://blog.csdn.net/flyingsbird/article/details/79533075
快速排序是一个“交换类”的排序,以军训排队为例,教官说:“第一个同学出列,其他人以他为中心,比他矮的全排到他的左边,比他高的全排他右边。”这就是一趟快速排序。可以看出,一趟快速排序是以一个“枢轴”为中心,将序列分成两部分,枢轴的一边全是比它小(或者小于等于)的,另一边全是比他大(或者大于等于)的。
原始序列: i j(i和j开始时分别指向头,尾元素)
进行第一趟快速排序,以第一个数49作为枢纽(通常都选第一个元素作为枢纽),整个过程是一个交替扫描和交换的过程。
)使用j,从序列最右端开始向前扫描,直到遇到比枢轴49小的数27,j停在这里。 i j
)将27交换到序列前端i的位置。 i j
)使用i,交换扫描方向,从前向后扫描,直到遇到比较枢轴49大的数65,i停在这里。 i j
)将65交换到序列后端j的位置。 i j
)使用j,交换扫描方向,从后向前扫描,直到遇到比枢轴49小的数13,j停在这里。 i j
)将13交换到i的位置。 i j
)使用i,交换扫描方向,从前向后扫描,直到遇到比49大的数97,i停在这里。 i j
)将97交换到j位置。 i j
)使用j,交换扫描方向,直到遇到比49小的数,当扫描到i与j相遇时,说明扫描过程结束了。 ij
)此时i等于j的这个位置就是枢轴49的最终位置,将49放入这个位置,第一趟快速排序结束。 ij
可以看出一次快速排序后,将原来的序列以49为枢轴,划分为两部分,49左边的数都小于或等于它,右边的数都大于或等于它。接下来按照同样的方法对序列{27 38 13}和序列{76 97 65 49}分别进行快速排序。经过几次这样的快速排序,最终得到一个有序的序列。
快速排序代码如下:
#!/user/bin/env.python
# _*_ coding;utf-8 _*_
# @Time :2018/10/25 15:02
import random
import datetime
def sub_sort(array,low,high):
key = array[low]
while low < high:
while low < high and array[high] >= key:
high -= 1
while low < high and array[high] < key:
array[low] = array[high]
low += 1
array[high] = array[low]
array[low] = key
return low def quick_sort(array,low,high):
if low < high:
key_index = sub_sort(array,low,high)
quick_sort(array,low,key_index)
quick_sort(array,key_index+1,high) if __name__ == '__main__':
array = list(range(100000))
random.shuffle(array)
print(array)
time1=datetime.datetime.now() quick_sort(array,0,len(array)-1)
time2=datetime.datetime.now()
print(array,'readtime:',time2-time1)
如上排序了100000个乱序的数,耗时 0:00:00.461000,性能很不错;
在最优的情况下,快速排序算法的时间复杂度为O(nlogn),同归并排序。
最糟糕情况下的快排时间复杂度为O(n^2)。
但空间复杂度低,所以综合起来处理时间比较短。
pyhton3 一些排序算法概括的更多相关文章
- <转>Java 常用排序算法小记
排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料. 废话不多说,下面逐一看看经典的排序算法: 1. 选择排序 选择排序的基本思想是遍历数组的过 ...
- js排序算法汇总
JS家的排序算法 十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外 ...
- JS中常见排序算法详解
本文将详细介绍在JavaScript中算法的用法,配合动图生动形象的让你以最快的方法学习算法的原理以及在需求场景中的用途. 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements Java ...
- 十大经典排序算法的 JavaScript 实现
计算机领域的都多少掌握一点算法知识,其中排序算法是<数据结构与算法>中最基本的算法之一.排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大 ...
- 排序算法<No.4>【基数排序】
由于春节,以及项目要上线的原因,导致这期的算法博文跟进的有点慢,内疚! 今天要介绍的是排序算法中的基数排序(Radix Sort),这类排序也是一个分而治之的排序,是对桶排序的一个升级和改造,也是稳定 ...
- Java中常用的6种排序算法详细分解
排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料. 废话不多说,下面逐一看看经典的排序算法: 1. 选择排序 选择排序的基本思想是遍历数组的过 ...
- 八大排序算法的python实现(四)快速排序
代码: #coding:utf-8 #author:徐卜灵 #交换排序.快速排序 # 虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤.因此我的对快速排序作了进一步的说明: ...
- python 十大经典排序算法
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选 ...
- js十大排序算法收藏
十大经典算法排序总结对比 转载自五分钟学算法&https://www.cnblogs.com/AlbertP/p/10847627.html 一张图概括: 主流排序算法概览 名词解释: n: ...
随机推荐
- HDU3232 Crossing Rivers 数学期望问题
Crossing Rivers ...
- python 使用入的坑
如测试代码,并没有将li.li_ 的交集查询出来 li=[1,2,3,4,5] li_=[2,5,6,7,9] for i in li_: if i in li: li_.remove(i) prin ...
- Box 类
public class Box extends JComponent implements Accessible使用 BoxLayout 对象作为其布局管理器的一个轻量级容器.Box 提供几个对使用 ...
- webpack & async await
webpack & async await ES 7 // async function f() { // return 1; // } const f = async () => { ...
- linux服务器上设置多主机头,设置多web站点
假设VPS的IP是58.130.17.168,有两个域名指向该IP,分别是domain1.com, domain2.com, 修改/etc/httpd/conf/httpd.conf,在文件的最后加入 ...
- [AHOI2014&&JSOI2014][bzoj3876] 支线剧情 [上下界费用流]
题面 传送门 思路 转化模型:给一张有向无环图,每次你可以选择一条路径走,花费的时间为路径上边权的总和,问要使所有边都被走至少一遍(可以重复),至少需要花费多久 走至少一遍,等价于覆盖这条边 也就是说 ...
- python爬虫异常处理
import urllib2 try: response = urllib2.urlopen('http://www.baidu.com') except urllib2.URLError, e: p ...
- bzoj 3101 N皇后构造一种解 数学
3101: N皇后 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 70 Solved: 32[Submit][S ...
- 运输问题2(cogs 12)
[问题描述] 一个工厂每天生产若干商品,需运输到销售部门进行销售.从产地到销地要经过某些城镇,有不同的路线可以行走,每条两城镇间的公路都有一定的流量限制.为了保证公路的运营效率,每条公路都有一 ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛部分题解
A 跳台阶 思路:其实很简单,不过当时直接dp来做了 AC代码: #define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include& ...