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: ...
随机推荐
- Zookeeper 增删改查
初始化对象连接到zookeeper服务: public ZooKeeper initZk(){ final CountDownLatch countDownLatch = new CountDownL ...
- 【转】UGUI VS NGUI
原文:http://gad.qq.com/college/articledetail/7191053 注[1]:该比较是基于15年-16年期间使用NGUI(3.8.0版本)与UGUI(4.6.9版本) ...
- HTML表格嵌套、合并表格
一.表格元素< table> table常用属性 border:边框像素 width,height:表格宽度/高度 bordercolor:表格边框颜色 bgcolor:表格背景颜色 二. ...
- gradle ofbiz 16 开发环境搭建
原 gradle ofbiz 16 开发环境搭建 2017年02月13日 10:59:19 阅读数:2702 1.安装jdk 2.配置jdk环境变量 3.eclipse 安装svn 插件 4.svn下 ...
- wsl折腾记
参考1 wsl在哪 C:\Users\用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndg ...
- 泛型Dictionary效率要大于HashTable!
原文发布时间为:2009-09-28 -- 来源于本人的百度文章 [由搬家工具导入] Dictionary,Hashtable, ArrayList, List学习 Dictionary 泛型的优点( ...
- [LeetCode] Letter Combinations of a Phone Number 回溯
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- 了解 Oracle Berkeley DB 可以为您的应用程序带来 NoSQL 优势的原因及方式。
将 Oracle Berkeley DB 用作 NoSQL 数据存储 作者:Shashank Tiwari 2011 年 2 月发布 “NoSQL”是在开发人员.架构师甚至技术经理中新流行的一个词汇. ...
- Hbuilder 快捷键
最近在学习javaweb 在学前端的时候用到了一款国产编辑器 很棒 Hbuilder 快捷键 Ctrl + d 删除整行内容 Ctrl + Shift +R ...
- hdu 1395(欧拉函数)
2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...