快速排序 <时间复杂度O(n㏒n)>

 def partition(li,left,right):
tmp = li[left]
while left < right:
while left<right and li[right]>=tmp: #从最右面开始找比tmp小的数
right -= 1
li[left] = li[right] #把右边的值写到左边空位上
while left<right and li[left]<=tmp:
left += 1
li[right] = li[left] #把右边的值写到左边空位上
li[left] = tmp #把tmp归为
return left #这个是分成两部分的值的下标 def quick_sort(li,left,right):
if left < right:
mid = partition(li,left,right)
quick_sort(li,left,mid-1)
quick_sort(li,mid+1,right)

堆排序 <时间复杂度O(n㏒n)> (不用递归)

 def sift(li,low,high):
i = low #i最开始指向根节点
j = 2*i+1 #把堆顶存起来
tmp = li[low]
while j<=high:#只要j位置有数
if j+1 <= high and li[j+1] > li[j]: #如果右孩子有并且比较大
j = j+1 #j指向右孩子
if li[j] > tmp:
li[i] = li[j]
i = j #往下看一层
j = 2*i+1
else: #tmp更大,把tmp放到i的位置上
# li[i] = tmp #把tmp放到某一级领导位置上
break
li[i] = tmp #把tmp放到叶子节点上 此i已经2*i+1了 def head_sort(li):
n = len(li)
for i in range((n-2)//2,-1,-1):
# i表示建堆的时候调整的部分的根的下标
sift(li,i,n-1)
#建堆完成了
for i in range(n-1,-1,-1):
#i 指向当前堆的最后一个元素
li[0],li[i] = li[i],li[0]
sift(li,0,i-1)#i-1是新的high

归并排序 <时间复杂度O(n㏒n)>

 def merge(li,low,mid,high):
i = low
j = mid+1
ltmp = []
while i<=mid and j<=high: #只要左右两边都有数
if li[i] < li[j]:
ltmp.append(li[i])
i+=1
else:
ltmp.append(li[j])
j+=1
while i <= mid:
ltmp.append(li[i])
i+=1
while j <= high:
ltmp.append(li[j])
j+=1
li[low:high+1] = ltmp def merge_sort(li,low,high):
if low < high:
mid = (low+high)//2
merge_sort(li,low,mid) #把左边排好序
merge_sort(li,mid+1,high) #把右边排好序
merge(li,low,mid,high)

优劣顺序:快速排序 > 归并排序 > 堆排序

其他一些low逼

冒泡排序 <时间复杂度O(n²)>

 def bubble_sort(li):
for i in range(len(li)-1): #i=趟数
exchange = False
for j in range(len(li)-i-1): #无序区
if li[j] < li[j+1]:
li[j],li[j+1] = li[j+1],li[j]
exchange = True
if not exchange:
return

选择排序 <时间复杂度O(n²)>  新建列表,内存占用×2

 def select_sort_simple(li):
li_new = []
for i in range(len(li)):
min_val = min(li)
li_new.append(min_val)
li.remove(min_val) # O(n)操作,删除之后列表元素需要挪位
return li_new

插入排序 <时间复杂度O(n²)>

 def insert_sort(li):
for i in range(1,len(li)):
tmp = li[i]
j = i-1 #最后一张牌的下标
while j >= 0 and li[j] > tmp:
li[j+1] = li[j]
j -= 1
li[j+1] = tmp

希尔排序

计数排序 <时间复杂度O(n)>

 def count_sort(li,max_count=100):
count = [0 for _ in range(max_count+1)]
for val in li:
count[val] += 1
li.clear()
for index,val in enumerate(count):
for i in range(val):
li.append(index)

桶排序

基数排序

一些排序 (python实现)的更多相关文章

  1. 选择排序-Python与PHP实现版

    选择排序Python实现 import random # 生成待排序数组 a=[random.randint(1,999) for x in range(0,36)] # 选择排序 def selec ...

  2. 计数排序与桶排序python实现

    计数排序与桶排序python实现 计数排序 计数排序原理: 找到给定序列的最小值与最大值 创建一个长度为最大值-最小值+1的数组,初始化都为0 然后遍历原序列,并为数组中索引为当前值-最小值的值+1 ...

  3. python内置数据类型-字典和列表的排序 python BIT sort——dict and list

    python中字典按键或键值排序(我转!)   一.字典排序 在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序. Py ...

  4. 选择排序——Python实现

    选择排序: 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小( ...

  5. 希尔排序——Python实现

    一.排序思想 希尔排序思想请参见:https://www.cnblogs.com/luomeng/p/10592830.html 二.python实现 def shellSort(arr): &quo ...

  6. 计数排序、桶排序python实现

    计数排序在输入n个0到k之间的整数时,时间复杂度最好情况下为O(n+k),最坏情况下为O(n+k),平均情况为O(n+k),空间复杂度为O(n+k),计数排序是稳定的排序. 桶排序在输入N个数据有M个 ...

  7. 经典排序 python实现

    稳定的排序算法:冒泡排序.插入排序.归并排序和基数排序. 不是稳定的排序算法:选择排序.快速排序.希尔排序.堆排序. 冒泡 def bobble(arr): length = len(arr) for ...

  8. 选择排序python实现

    选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完.注意每次查找 ...

  9. 希尔排序--python

    import random import time # 插入排序 def insertion_sort(arr, step): for i in range(step, len(arr)): for ...

随机推荐

  1. Python爬虫入门六之Cookie的使用

    大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在 ...

  2. btrfs的介绍与使用

    源文献:http://www.ibm.com/developerworks/cn/linux/l-cn-btrfs/index.html#ibm-pcon 简单看了一下这篇文章,对其中一些机制的实现还 ...

  3. HttpAnalyzerStdV7使用教程

    相关链接:HttpAnalyzerStdV7安装教程 1.1.使用HttpAnalyzerStdV7监控服务器返回消息 1.运行前关闭要监控的浏览器. 2.运行软件: 3.点击"Start& ...

  4. PHP中文乱码解决办法[转]

    一.首先是PHP网页的编码1.     php文件本身的编码与网页的编码应匹配a.     如果欲使用gb2312编码,那么php要输出头:header(“Content-Type: text/htm ...

  5. 公司web安全等级提升

    目录 背景介绍 目录 针对国调的初次测试结果 解决方案 二次测试 关于XSS 什么是XSS 基本防御 代码防御 xss代码辑录 说明 参考文章 版本记录 背景介绍 公司的一个web数据展示系统,本来是 ...

  6. JPA和Hibernate的相关使用技巧

    介绍 尽管有SQL标准,但每个关系数据库终将是唯一的,因此你需要调整数据访问层,以便充分利用在使用中的关系数据库. 在本文中,我们将介绍在使用带有JPA和Hibernate的MySQL时,为了提高性能 ...

  7. C# 自带的.net类库 实现得到本机IP以及网关地址

    今天需要用到一个功能,获取主机名和本机的IP 准备用API实现的,然后稍微查了一下,发现.net类库已经有了 就在System.Net命名空间中的DNS类中 GetHostName 获取本地计算机的主 ...

  8. 【扫盲贴】为什么屏幕分辨率是 640x480

    本文原地址:http://www.easyx.cn/skills/View.aspx?id=172 常见的屏幕分辨率很奇怪,为什么总用一些不零不整的数字?比如以前最常见的分辨率是 640x480,当初 ...

  9. idea中java文件打包出去步骤

     打包出去之后 通过xftp放在Linus上面去运行 然后用hadoop fs -put 放到hadoop集群上面(而且此时在/user/hadoop下面创建好input文件夹和一个输入的文件) 即 ...

  10. 在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数)

    //在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数) function formatNum(num ...