冒泡排序

依次比较相邻两元素,若前一元素大于后一元素则交换之,直至最后一个元素即为最大;

然后重新从首元素开始重复同样的操作,直至倒数第二个元素即为次大元素;

依次类推。如同水中的气泡,依次将最大或最小元素气泡浮出水面。

实现

# 冒泡排序
def bubble_sort(li):
# 建立一个标识符
flag = False
for i in range(len(li)-1):
for j in range(len(li)-i-1):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
flag = True
# 如果没进行交换,则本身有序,直接break
if not flag:
break
return li

算法分析

  • 平均时间复杂度:O(n2),标准的内外两层循环
  • 最好时间复杂度:O(n),如果有序,那么第一趟就ok了
  • 最坏时间复杂度:O(n2)
  • 空间复杂度:O(1)
  • 稳定性:稳定的

选择排序

首先初始化最小元素索引值为首元素,依次遍历待排序数列,若遇到小于该最小索引位置处的元素则刷新最小索引为该较小元素的位置,直至遇到尾元素,结束一次遍历,并将最小索引处元素与首元素交换;

然后,初始化最小索引值为第二个待排序数列元素位置,同样的操作,可得到数列第二个元素即为次小元素;以此类推。

实现

# 选择排序 O(n^2)
# 从第一个元素开始选择最小的元素放在第一位,然后再选择第二个元素
def select_sort(li):
for i in range(len(li)-1):
# 第i趟 无序区范围i到最后
min_pos = i # 无序区最小值位置
for j in range(i+1, len(li)):
if li[j] < li[min_pos]:
min_pos = j
li[i], li[min_pos] = li[min_pos], li[i]

算法分析

  • 平均时间复杂度:O(n2),嵌套双循环
  • 最好时间复杂度:O(n2),每次要找最大最小肯定是要遍历一遍的
  • 最坏时间复杂度:O(n2)
  • 空间复杂度:O(1)
  • 稳定性:稳定的

插入排序

将列表分为有序区和无序区两个部分,最初有序区只有一个元素,即第一个元素。

然后每次从无序区选择一个元素,插入到有序区中,直到无序区为空。

如下图,橙色为有序区,浅蓝色为无序区。

实现

# 选择排序 O(n2)
def insert_sort(li):
# i表示从下标1开始的数字, 第二个元素
for i in range(1, len(li)):
tmp = li[i]
j = i - 1
# 只要往后挪就循环
while j >= 0 and li[j] > tmp:
# 如果j = -1停止挪, 如果li[j]小于tmp停止挪
li[j + 1] = li[j]
j -= 1
# j位置在循环结束的时候要么是-1要么是比tmp小的值
li[j+1] = tmp

算法分析

  • 平均时间复杂度:O(n2)
  • 最好时间复杂度:O(n),如果有序,那么每个元素都已经在在它的待排子序列的合适位置,不用找合适位置
  • 最坏时间复杂度:O(n2)
  • 空间复杂度:O(1)
  • 稳定性:稳定的

~>.<~

使用python实现冒泡、选择、插入基础排序的更多相关文章

  1. python 数据结构与算法之排序(冒泡,选择,插入)

    目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习 ...

  2. C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)

    算法是解决一类问题的方法排序算法 根据元素大小关系排序 从小到大 从大到小冒泡 选择 插入 快排希尔排序 归并排序 堆排序 冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮 选择排序 1 ...

  3. python 中的一些基础算法:递归/冒泡/选择/插入

    递归算法 如果一个函数包含了对自己的调用,那么这个函数就是递归的. 比如我们计算下1-7乘法的计算: def func(n): if n ==1 : return 1 return n*func(n- ...

  4. 基本排序-冒泡/选择/插入(python)

    # -*- coding: utf-8 -*- import random def bubble_sort(seq): n = len(seq) for i in range(n-1): print( ...

  5. Python 多级目录选择+一键正反排序

    效果如图所示,可以根据条件来选择对象 cat pc.py #!/usr/bin/pythonfrom flask import Flask,render_template,request,redire ...

  6. java 基础排序(冒泡、插入、选择、快速)算法回顾

    java 基础排序(冒泡.插入.选择.快速)算法回顾 冒泡排序 private static void bubbleSort(int[] array) { int temp; for (int i = ...

  7. python数据结构之选择排序

    选择排序(select_sort)是一个基础排序,它主要通过查找已给序列中的元素的最大或者最小元素,然后将其放在序列的起始位置或者结束位置,并通过多次这样的循环完成对已知序列的排序,在我们对n个元素进 ...

  8. Python与Go选择排序

    #!/usr/bin/env python # -*- coding: utf-8 -*- # 选择排序 # 时间复杂度O(n^2) def selection_sort(array): length ...

  9. Python实现的选择排序算法原理与用法实例分析

    Python实现的选择排序算法原理与用法实例分析 这篇文章主要介绍了Python实现的选择排序算法,简单描述了选择排序的原理,并结合实例形式分析了Python实现与应用选择排序的具体操作技巧,需要的朋 ...

随机推荐

  1. NetCore使用使用Scaffold-DbContext命令生成数据库表实体类

    一.为了模拟项目,本处创建了一个NetCore的Web项目.打算在Models文件夹下生成数据库表的实体类. 二.在程序包管理控制台,输入“Scaffold-DbContext "Serve ...

  2. codeforces 99999/553 Sultan's Pearls Solution 珍珠 题解

    文章目录 珍珠 题意 分析 增加限定条件 去掉限定条件 Code 珍珠 题意 一共n课珍珠,m颗悬挂,其余在桌子上.如图所示. 仆人每天从某一端"借"一颗珍珠珠.主人每天都会检查悬 ...

  3. python开发第一篇:初识python

    一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  4. laravel框架api路由

    Route::group(['namespace' => 'Api'], function (){ Route::any('send','SmsController@send'); }); gr ...

  5. [Python]BeautifulSoup安装与使用

    1.BeautifulSoup简介 BeautifulSoup4和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据 ...

  6. 在vue项目中使用MD5.js

    1.安装 npm install --save js-md5 2.引入 import md5 from 'js-md5'; 3.使用 md5('holle') // bcecb35d0a12baad4 ...

  7. 【剑指Offer】39:平衡二叉树

    题目描述: 输入一棵二叉树,判断该二叉树是否是平衡二叉树 题解:递归 /*最直接的做法,遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断 ...

  8. 《深入理解java虚拟机》读书笔记七——第八章

    第八章 虚拟机字节码执行引擎 1.运行时栈帧结构 概述: 栈帧是用于支持虚拟机进行方法调用的和方法执行的数据结构,他是虚拟机运行时数据区中的虚拟机栈的栈元素,栈帧存储了方法的局部变量,操作数栈,动态连 ...

  9. PP: GRU-ODE-Bayes: Continuous modeling of sporadically-observed time series

    From: KU Leuven; ESAT-STADIUS比利时鲁汶大学 ?? How to model real-world multidimensional time series? especi ...

  10. PHP获取小程序码并返回前端显示图片

    小程序的二维码分为小程序码和二维码: 生成小程序二维码文档中说后端来生成. 参考 小程序开发文档资料:https://developers.weixin.qq.com/miniprogram/dev/ ...