Python数据结构(七)排序算法 上

上回:

本文的重点不是代码,而是带着大家分析每一个排序算法背后的思想以及使用到的数据结构。很多时候不是我们想不出算法该如何去写,而是题目并没有指定特定的数据结构,比如说同样一个一维数组排序问题,让我选择用Binary Sort Tree和用Heap,我肯定选择前者,因为它名字长(别打我!)。

一、冒泡排序

入门必备的排序算法,非常的古老了,想当初我的C语言入门代码就是这个算法,当时交作业的时候在网上随便抄了一个上去,结果被老师发现了,一顿臭骂…...

原理请记住一个:一个有序的数组是不存在逆序对的。所谓的逆序对,比如说我们要数组元素越来越大,那么其中任何两两组成的对子(43,56)前面比后面的数值大的都是逆序对,应对方法是只要把这些逆序对调换过来即可。

def bubbleSort(array:list)->None:

flag = False

bias = 0

LENGTH_ARRAY = len(array)

while not flag:

for i in range(1,LENGTH_ARRAY-count):

if array[i-1] > array[i]:

array[i-1],array[i] = array[i],array[i-1]

flag = True

bias += 1

flag = not flag

这里设计这个flag 的目的在于检测当前数组里是否存在逆序对,如果存在至少一个逆序对,则flag就会被设置成True,再在For循环末尾被取反变成False,这样就能够保证while 的判断条件持续为真。因此,只要当前数组不存在逆序对,则while循环就会被终止,而这样也非常符合逻辑,因为如果把剩下未排序数组遍历完一遍发现没有逆序对,那就不用再遍历。

二、选择排序

整个一维数组分成两个部分,前一部分是有序数组,后一部分是无序数组,每次呢,都是从后面的无序数组部分挑选出最小的那个(时间复杂度O(n))作为前面有序数组的最后一个元素。

因为每次只能选择一个元素,而整个数组的规模是n,所以重复n次,总的时间复杂度是O(n^2)。

def selectSort(array:list)->None:

LENGTH_ARRAY = len(array)

for i in range(0,LENGTH_ARRAY-1):

minIndex = i

for j in range(i+1,LENGTH_ARRAY):

if array[minIndex] > array[j]:

minIndex = j

if minIndex != i:

array[minIndex],array[i] = array[i],array[minIndex]

稍微解释一下 为什么外层for 是到LENGTH_ARRAY-1停止。因为当我们前n-1个元素都已经是有序的时候,最后一个元素就是整个数组里最大的(这点可以明白不?)于是乎,不用排序了。

三、插入排序

插入排序和选择排序在形式上是非常相似的,逻辑都是由“选择”+ “插入(调换)”组成。

先介绍一下插入排序和宏观思想:

假设当前遍历到第n个元素,原来数组以第n个元素为分界线分成两部分,前一部分是已经从小到大排好序的数组,第n个元素之后是未排好序的数组,在n不断向后移动的过程中,有序数组长度不断增长直到和原数组一样,此时排序结束。

插入排序的精髓: 每次迭代,都选择一个元素进行插入,选择的时间复杂度为O(1);插入的过程中根据插入的方式不同,有二分插入、线性插入,对应的时间复杂度也会不同,二分的是log(n),线性是O(n)。和选择排序相比,插入排序在插入部分耗时最多,而选择排序在选择部分耗时最多。

接下来用python实现插入排序的线性插入。

def insertionSort(array:list)->None:

for i in range(1,len(array)):

for j in range(i,0,-1):

if array[j-1] > array[j]:

array[j-1],array[j] = array[j],array[j-1]

else:

break # 无需比较

说真的,这个插入排序版本很想冒泡排序的逆过程,就像是每次都把最后一个元素一直往前怼,怼到不能再怼的位置停下来,再把下一个元素往前怼…说的不是很文雅但是意思就是这么个意思。

另外我在这个github版本里还添加了自己的insertionSort版本,那个是我第一次写insertionsort 算法,大家可以对照一下,虽然更加繁琐了,但是还挺好玩的: python 实现排序算法

总结

本节主要讲解了冒泡排序、选择排序、插入排序三种排序算法,三者都是非常古老的算法。排序算法之所以重要,是因为我们在日常coding 中如果操作的数据是在有序结构的数据上,时间复杂度是会大大减少很多的,人生本就苦短,我用算法+ python。

引用

python结构排序_Python数据结构(七)排序算法 上相关推荐

  1. python八大选择排序_Python实现选择排序

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

  2. 希尔排序python 简书_数据结构_排序_直接插入+希尔排序

    数据结构_排序_直接插入排序+希尔排序 其实主要是为了讲述希尔排序,不过插入排序是希尔排序的基础,因此先来讲直接插入排序. 一.直接插入排序 1.原理 下标 0 1 2 3 4 5 6 7 8 -- ...

  3. python选择排序_Python实现选择排序

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

  4. python的内置函数列表排序_Python 列表的排序 - sort/sorted

    Python 集合的遍历,推导及 filter/map/reduce 操作 中讲了对集合的 filter, map 和 reduce 操作,那还有 sort 排序呢?像 Java 一样,Python  ...

  5. python遍历树结构_python 数据结构与算法——树的遍历

    1.广度优先遍历 2.深度优先遍历 先序遍历:把根放在最前面 中序遍历:把根放在中间 后序遍历:把根放在后面 # -*- coding: utf-8 -*- """ Cr ...

  6. python dataframe排序_python – Pandas DataFrame排序忽略了这种情况

    我在 Python中有一个Pandas数据帧.数据帧的内容来自 here.我稍微修改了"单个"列中第一个字母的大小写.这是我有的: import pandas as pd df = ...

  7. python对象数组排序_Python NumPy 数组 排序

    1.数组排序 NumPy ndarray对象具有一个名为sort()的函数,该函数将对指定的数组进行排序. 例如: 排序数组:import numpy as np arr = np.array([3, ...

  8. python结构体_Python实现结构体代码实例

    Python实现结构体代码实例 这篇文章主要介绍了Python实现结构体代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 # python 使 ...

  9. problem a: 简单的整数排序_python里的排序

    本篇文章主要讲: 自定义规则排序 多字段排序 开讲之前,先讲一些简单sorted()或者sort(),两者返回值不同!例如: sorted([5, 2, 3, 1, 4]) # 输出:[1, 2, 3 ...

最新文章

  1. 角逐同城货运,快狗打车抢跑上市
  2. 鼠标聚焦到Input输入框时,按回车键刷新页面原因及解决方法
  3. matlab寻找函数对应的工具箱
  4. jzoj4235-序列【斐波那契数列】
  5. 电量计在手持设备中的实现
  6. 新浪微博:已经吃下去的,又全都吐出来了!
  7. php 面向对象进阶,PHP面向对象进阶设计模式:解释器模式使用实例
  8. git submodule详解
  9. 《UNIX环境高级编程》随书代码的打开方式
  10. idea 离线安装sonarlint 插件
  11. 华为模拟器eNSP将防火墙配置成三层核心交换机
  12. linux某用户 计划任务,Linux计划任务管理
  13. 用还原精灵做“硬盘还原卡”(转)
  14. 中国互联网+政务建设产业运行状况分析及前景战略研究报告2022-2028年版
  15. 树形选择排序(第十章 P279)
  16. Linux服务器搭建项目运行环境
  17. 《开天辟地》之《网上冲浪篇》将带你进入一个精彩的互联网世界
  18. JDBC学习总结及复习笔记(附MySQL驱动和JDK-API中文版)
  19. HUAWEI Sound Joy首发体验,独具一格的华为音质究竟如何呢?
  20. 便利蜂 java后端开发 面经

热门文章

  1. 树莓派 2 和 3 上的 Swift 3.0
  2. 11.11买电脑怎么选?请收下这份武极电脑爆款清单
  3. 【遥感遥测】【2020.05】利用卫星影像进行城市土地利用类型的遥感分类
  4. QT程序 windows窗口置顶和linux窗口置顶遇到的问题和解决方案
  5. Roberto Giobbi的纸牌大学
  6. Android 进程管理
  7. MYSQL 清除表中数据
  8. PHP-echo换行处理
  9. mate9 android8.0 rom,华为Mate9 8.0降级:EMUI8.0回退到EMUI5.0/安卓8.0降级7.0
  10. 经典权限系统设计(五张表)