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 一些排序算法概括的更多相关文章

  1. <转>Java 常用排序算法小记

    排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料. 废话不多说,下面逐一看看经典的排序算法: 1. 选择排序 选择排序的基本思想是遍历数组的过 ...

  2. js排序算法汇总

    JS家的排序算法   十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外 ...

  3. JS中常见排序算法详解

    本文将详细介绍在JavaScript中算法的用法,配合动图生动形象的让你以最快的方法学习算法的原理以及在需求场景中的用途. 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements Java ...

  4. 十大经典排序算法的 JavaScript 实现

    计算机领域的都多少掌握一点算法知识,其中排序算法是<数据结构与算法>中最基本的算法之一.排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大 ...

  5. 排序算法<No.4>【基数排序】

    由于春节,以及项目要上线的原因,导致这期的算法博文跟进的有点慢,内疚! 今天要介绍的是排序算法中的基数排序(Radix Sort),这类排序也是一个分而治之的排序,是对桶排序的一个升级和改造,也是稳定 ...

  6. Java中常用的6种排序算法详细分解

    排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料. 废话不多说,下面逐一看看经典的排序算法: 1. 选择排序 选择排序的基本思想是遍历数组的过 ...

  7. 八大排序算法的python实现(四)快速排序

    代码: #coding:utf-8 #author:徐卜灵 #交换排序.快速排序 # 虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤.因此我的对快速排序作了进一步的说明: ...

  8. python 十大经典排序算法

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选 ...

  9. js十大排序算法收藏

    十大经典算法排序总结对比 转载自五分钟学算法&https://www.cnblogs.com/AlbertP/p/10847627.html 一张图概括: 主流排序算法概览 名词解释: n: ...

随机推荐

  1. 常用JS整理

    目录 1 事件 a addEventListener--绑定事件b removeEventListener--解绑事件,只能解开addEventListener绑定的事件 2 JS获取节点信息a by ...

  2. input框的限制(仅数字以及电话号码的限制)

    电话号码限制 <input  type="text"  id="phone" maxlength="11" onkeyup=" ...

  3. Log4j官方文档翻译(三、配置)

    之前的章节介绍了log4j的核心组件,本章将会通过配置文件介绍一下核心组建的配置. 主要在配置文件中配置log4j的日志级别,定义appender.layout等. log4j.properties是 ...

  4. [SDOI2008][luogu2463] Sandy的卡片 [kmp]

    题面 传送门 思路 这道题里面有三个主要问题: 1.由"数值相等"变成了"加上一个整数以后数值相等"(减去等价于加负数) 2.由"最多匹配多少位(从第 ...

  5. BZOJ3260 跳 【组合数】

    题目 邪教喜欢在各种各样空间内跳.现在,邪教来到了一个二维平面. 在这个平面内,如果邪教当前跳到了(x,y),那么他下一步可以选择跳到以下4个点: (x-1,y),(x+1,y),(x,y-1),(x ...

  6. http content-type总结

    content-type 媒体类型,即MIME类型,包括媒体格式和编码两部分 例如:Content-Type:text/html;charset:utf-8 常见的媒体格式类型如下: text/htm ...

  7. IDA 调试 Android

    最近都在学一些反编译安卓相关的东西,其实网上有很多教程关于用 IDA 调试 Android 的过程,主要记录一下我遇到的坑 首先 Android手机要是root过的 还要注意的一点是apk中的 And ...

  8. FOJ Problem 2273 Triangles

    Problem 2273 Triangles Accept: 201    Submit: 661Time Limit: 1000 mSec    Memory Limit : 262144 KB P ...

  9. 什麼是 usb upstream port

    主機USB埠是定義為USB纜線的上行端(Upstream)或「A」接頭,即PC端.而裝置USB埠是定義為USB纜線的下行端(Downstream)或「B」接頭,即行動產品端. Reference ht ...

  10. C# 的 String.CompareTo Equals和==的比较

    String.CompareTo 语法 public int CompareTo(    string strB) 返回值 小于 0,实例小于参数 strB: 0,实例等于参数 strB: 大于 0, ...