排序算法总结

冒泡排序

相邻两个元素,两两循环比较,每趟筛选出一个最大或者最小的元素(有序区在后面)

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完成排序算法的更多相关文章

  1. Python之排序算法:快速排序与冒泡排序

    Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...

  2. python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序

    说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...

  3. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

  4. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  5. Python实现排序算法之快速排序

    Python实现排序算法:快速排序.冒泡排序.插入排序.选择排序.堆排序.归并排序和希尔排序 Python实现快速排序 原理 首先选取任意一个数据(通常选取数组的第一个数)作为关键数据,然后将所有比它 ...

  6. python 经典排序算法

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

  7. Python 实现排序算法

    排序算法 下面算法均是使用Python实现: 插入排序 原理:循环一次就移动一次元素到数组中正确的位置,通常使用在长度较小的数组的情况以及作为其它复杂排序算法的一部分,比如mergesort或quic ...

  8. python——常见排序算法解析

    算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序, ...

  9. python之排序算法

    排序是每个语言都需要学会的,不管是c++.java还是python,套路都是类似的 python中也有自带的排序函数sort,直接使用也可 闲来无事写了几个排序算法,各不相同 1.每次遇到最小的数都交 ...

  10. Python 八大排序算法速度比较

    这篇文章并不是介绍排序算法原理的,纯粹是想比较一下各种排序算法在真实场景下的运行速度. 算法由 Python 实现,用到了一些语法糖,可能会和其他语言有些区别,仅当参考就好. 测试的数据是自动生成的, ...

随机推荐

  1. 腾讯面试Android高级岗,居然被一个多线程基础面倒了?

    前言 一个在深圳从事开发五年的老友一个月前从原公司辞职后,昨天去腾讯总部面试Android高级岗,一面的时候,自我介绍后,陆陆续续问了很多问题,有着五年的从业经验很多项目开发的技术问题都回答的很通顺, ...

  2. node_promise

    学习链接 http://liubin.org/promises-book/#__5

  3. 洛谷P1192-台阶问题(线性递推 扩展斐波那契)

    占坑 先贴上AC代码 回头来补坑 #include <iostream> using namespace std; int n, k; const int mod = 100003; lo ...

  4. String s = new String("xyz");创建了几个String Object?并作说明。

    String s = new String("xyz");创建了几个String Object?并作说明. 共产生了两个2个对象,第一个是字符串常量xyz,存储于常量池中.第二个对 ...

  5. SpringMVC的乱码问题

    1:表单提交controller获得中文参数后乱码解决方案 注意: jsp页面编码设置为UTF-8 form表单提交方式为必须为post,get方式下面spring编码过滤器不起效果 <%@ p ...

  6. qhclass

    http://www.qhclass.com/classroom/62/courses

  7. mapreduce 读写Parquet格式数据 Demo

    import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs ...

  8. scrapy-模块

    爬虫模块:beautifulsoup4 scrapy_splash: pip install scrapy_splash scrapy_splash模块,与selenium类似,用来获取js渲染后的h ...

  9. 对最长公共子序列(LCS)等一系列DP问题的研究

    LIS问题: 设\(f[i]\)为以\(a[i]\)结尾的最长上升子序列长度,有: \[f[i]=f[j]+1(j<i&&a[j]<a[i])\] 可以用树状数组优化至\( ...

  10. JS 常见问题

    JavaScript 是一种有趣的语言,我们都喜欢它,因为它的性质.浏览器是JavaScript的主要运行的地方,两者在我们的服务中协同工作.JS有一些概念,人们往往会对它掉以轻心,有时可能会忽略不计 ...