1. 冒泡排序

  算法描述:1. 比较相邻的两个数,对升序(/降序)而言,若当前数小于(大于)后一个数则交换两者的位置。

       2.那么循环长度为L的列表,从第一个元素到倒数第(L-1)元素进行第1步操作,其结果是第L个元素必定是最小值;也就是说单次循环确定了一个数的排序位置,单次循环次数为(L-1);

       3. 要确定所有元素的排序位置,还需要L-1次,因为每次循环确定了一个元素的位置,当第(L-1)次循环时,L-1个元素的位置都被确定了,剩下的一个自然被确定。

  图片演示:

  

  代码实现:

# coding:utf-8
import timeit def bubble_sort(seq:list):
"""冒泡排序, seq为有效待排序列表"""
for i in range(len(seq)-1):
for j in range(len(seq)-1):
if seq[j] < seq[j+1]:
seq[j], seq[j+1] = seq[j+1], seq[j]
return seq if __name__ == '__main__':
print(bubble_sort([i for i in range(10)]))
# t = timeit.Timer("bubble_sort([i for i in range(1000)])", "from __main__ import bubble_sort")
# print(t.timeit())

  运行结果:

  

  最优时间复杂度:O(N)

  最坏时间复杂度:O(N^2)

  稳定性:稳定

2. 选择排序

  算法描述:1. 将当前元素与其后所有元素进行比较,若大于(小于)则置换两个元素;

       2. 对于长度为L的列表,第1步操作完成能确定一个元素的位置;

       3.要确定L个元素的位置,则需循环L-1次;

  图片演示:

  

  代码实现:

# coding:utf-8

def select_sort(seq:list):
"""选择排序(降序)"""
for i in range(len(seq)-1):
# 暂存待置换的元素的值
cur_max = seq[i]
for j in range(i+1, len(seq)):
if seq[j] > cur_max:
cur_max = seq[j]
seq[i], seq[j] = seq[j], seq[i]
return seq if __name__ == '__main__':
print(select_sort([i for i in range(10)]))  

  最优时间复杂度:O(N^2)

  最坏时间复杂度:O(N^2)

  稳定性:不稳定

3. 插入排序

  算法描述:选择排序的关键在于向后比较,而插入排序与之相反,是向前比较并调整相应元素位置

       1. 对于列表长度为L的列表而言,循环从第N个数开始向前与第N-1进行比较,若大于(小于)则交换位置;

       2. 要实现所有的数排序,另加一层L-1次的循环;

  图片演示:

  

  代码实现:

# coding:utf-8

def insert_sort(seq:list):
"""插入排序(降序)"""
for i in range(len(seq)):
for j in range(i, 0, -1):
# 倒序交换相邻两个的取值
if seq[j] > seq[j-1]:
seq[j], seq[j-1] = seq[j-1], seq[j]
return seq if __name__ == '__main__':
print(insert_sort([i for i in range(10)]))

  最优时间复杂度:O(N)

  最坏时间复杂度:O(N^2)

  稳定性:稳定

4. 快速排序

  算法描述:       

  一趟快速排序的算法是:
  1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
  2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
  3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]的值交换;
  4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换;
  5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

  图片演示:

  

  

  代码实现:

# coding:utf-8

def fast_sort(seq:list, left, right):
"""
快速排序(升序)
:param left:左部起始位置
:param right: 右部起始位置
"""
if right<=left:
return low = left
high = right # 基准值
mid = seq[left] while low < high:
# 从右扫描找出小于基准值的数
while low<high and seq[high]>mid:
high -= 1
seq[low] = seq[high]
# 向左扫描找出大于基准值的数
while low<high and seq[low]<=mid:
low += 1
seq[high] = seq[low] # 此时low=high, 确定了基准值在序列中的排序位置
seq[low] = mid # 递归排序low左右两边的序列
fast_sort(seq, low+1, right)
fast_sort(seq, left, low-1) if __name__ == '__main__':
seq = [i for i in range(10,0,-1)]
fast_sort(seq, 0, len(seq)-1)
print(seq)

  最优时间复杂度:O(NlogN)

  最坏时间复杂度:O(N^2)

  稳定性:不稳定

5. 希尔排序

  算法描述:

      希尔排序是对插入排序的一种优化,主要在于设置了以步长来比较两个元素的值;

      1. 

  图片演示:

 

  代码实现:

  

  最优时间复杂度:O(NlogN)

  最坏时间复杂度:O(N^2)

  稳定性:不稳定

主要排序算法(Python实现)的更多相关文章

  1. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  2. 三种排序算法python源码——冒泡排序、插入排序、选择排序

    最近在学习python,用python实现几个简单的排序算法,一方面巩固一下数据结构的知识,另一方面加深一下python的简单语法. 冒泡排序算法的思路是对任意两个相邻的数据进行比较,每次将最小和最大 ...

  3. 排序算法-python版

    总结了一下常见集中排序的算法 归并排序 归并排序也称合并排序,是分治法的典型应用.分治思想是将每个问题分解成个个小问题,将每个小问题解决,然后合并. 具体的归并排序就是,将一组无序数按n/2递归分解成 ...

  4. 十大经典排序算法(Python,Java实现)

    参照:https://www.cnblogs.com/wuxinyan/p/8615127.html https://www.cnblogs.com/onepixel/articles/7674659 ...

  5. 排序算法 python实现

    一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两 ...

  6. 基本排序算法[python实现]

    冒泡排序 原理 冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换, ...

  7. 九大常用排序算法 python

    1.冒泡排序 import random from timewrap import * @cal_time def bubble_sort(li): for i in range(len(li)-1) ...

  8. 八大排序算法python实现

    一.概述   排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当 ...

  9. [数据结构与算法]排序算法(Python)

    1.直接插入排序 给定一个数组后,从第二个元素开始,如果比第一个小,就跟他交换位置,否则不动:第三个元素如果比第二个小,把第三个跟第二个交换位置,在把第二个与第一个比较:..... def inser ...

  10. 排序算法Python(冒泡、选择、快速、插入、希尔、归并排序)

    排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们通常所说的排序算法往往指的是内部排序算法,即数据 ...

随机推荐

  1. 【洛谷 P2483】 【模板】k短路([SDOI2010]魔法猪学院)(A*)

    题目链接 优先队列bfs第一次出队就是最短路,那么显然第k次出队就是k短路 ?????????????????????????????? 书上写的 但是直接优先队列bfs会T,所以用A*优化就行,估价 ...

  2. UCOSIII等待多个内核对象

    内核对象 内核对象包括信号量.互斥信号量.消息队列和事件标志组 UCOSIII中允许任务同时等待多个信号量和多个消息队列 主结构体 typedef struct os_pend_data OS_PEN ...

  3. vue routes路由

    mode: 'history',去掉浏览器上url前的#号

  4. SQL SERVER-SSMS安装联机丛书 book online

    1.下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=42557 2.解压. 3.在SSMS中添加引用. 选择解压路径找到ms ...

  5. Spark 宽窄依赖和stage的划分

    窄依赖 父RDD和子RDD partition之间的关系是一对一的,或者父RDD一个partition只对应一个子RDD的partition情况下的父RDD和子RDD partition关系是多对一的 ...

  6. Spark-2.3.2 HBase BulkLoad

    在大量数据需要写入HBase时,通常有Put方式和BulkLoad两种方式. Put不做解释. BulkLoader方式的优势在于: 1.不会触发WAL预写日志,当表还没有数据时进行数据导入不会产生F ...

  7. head meta属性整理笔记

    最近做这个站点http://zhimo.yuanzhumuban.cc/,百度一直出现转码问题,很头疼,通过一周时间研究meta属性,达到了代码优化的效果,在此做一些笔记. <head> ...

  8. machine learning (2)-linear regression with one variable

    machine learning- linear regression with one variable(2) Linear regression with one variable = univa ...

  9. .net框架-栈(Stack)

    栈(Stack) 栈代表一个后进先出的集合 栈元素为Object类型 .net框架提供Stack<T>泛型栈类 压栈(Push)和出栈(Pop)是栈的基本操作,压栈入栈顶,出栈也出栈顶. ...

  10. java设计模式解析(11) Chain责任链模式

    设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...