冒泡排序

原理

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。(时间复杂度:O(n^2))

步骤

冒泡排序算法的运作如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
# -*- coding: utf-8 -*- 

def bubbl_sort(array):
l = len(array)
#第一次遍历
for i in range(l):
exchange = False #这是一个tag,主要作用是对冒泡做一个小优化,
#当第二次遍历中没有元素交换时,便认为list已经是有序的了
#第二次遍历
for j in range(i+1,l):
if array[i] > array[j]:
array[j], array[i] = array[i], array[j]
exchange = True
if not exchange: #如tag为False则退出
break
return array

选择排序

原理

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理大致是将后面的元素最小元素一个个取出然后按顺序放置。(时间复杂度:O(n^2))

步骤

  1. 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,
  2. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  3. 重复第二步,直到所有元素均排序完毕。
# -*- coding: utf-8 -*-

def select_sort(array):
l = len(array)
for i in range(l-1):
mix_loc = i
for j in range(i+1,l):
if array[j] < array[mix_loc]:
mix_loc = j
array[i], array[mix_loc] = array[mix_loc], array[i]
return array

插入排序

原理

插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。(时间复杂度:O(n^2))

步骤

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5
# -*- coding: utf-8 -*-

def insert_sort(array):
for i in range(1,len(array)):
tmp = array[i]
j = i - 1
while j >=0 and array[j] > tmp:
array[j+1] = array[j]
j = j - 1
array[j + 1] = tmp
return array

快速排序

原理

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。(时间复杂度:O(nlogn))

步骤

  1. 从数列中挑出一个元素,称为”基准”(pivot),

  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

# -*- coding: utf-8 -*-

def quick_sort(array,reverse=False):
# 使用reverse参数实现对列表的正序和倒序的排序(默认为正序)
def sort(array):
if len(array) < 2:  #基线条件
return array
else:
pivot = array[0]  #递归条件
less = [i for i in array[1:] if i <= pivot]
greater = [i for i in array[1:] if i > pivot]
return sort(less) + [pivot] + sort(greater)
if reverse:
return sort(array)[-1::-1]
else:
return sort(array)

基本排序算法[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

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

  7. 八大排序算法python实现

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

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

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

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

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

随机推荐

  1. Java 控制语句:循环、条件判断

    基础很重要,基础很重要,基础很重要.重要的事情说三遍,. 程序设计中的控制语句主要有三种:顺序.分支和循环.我们每天写的代码,除了业务相关,里面会包含大量的控制语句.但是控制语句的基本使用,是否有些坑 ...

  2. BAT美团滴滴java面试大纲(带答案版)之三:多线程synchronized

    继续面试大纲系列文章. 从这一篇开始,我们进入ava编程中的一个重要领域---多线程!多线程就像武学中对的吸星大法,理解透了用好了可以得道成仙,俯瞰芸芸众生:而滥用则会遭其反噬. 在多线程编程中要渡的 ...

  3. Jenkins-job之间依赖关系配置

    使用场景: 想要在某APP打新包之后,立即执行自动化测试的job来验证该新包. 比如Job A 执行完执行Job B ,如下图所示,如何建立依赖呢? 1.配置上游依赖 构建触发器-配置如下信息: 选择 ...

  4. java----牛客练习

    1. 形式参数就是函数定义时设定的参数.例如函数头 int min(int x,int y,int z) 中 x,y,z 就是形参.实际参数是调用函数时所使用的实际的参数.   真正被传递的是实参   ...

  5. H5 audio标签

    37-audio标签 注意点: audio标签的使用和video标签的使用基本一样, video中能够使用的属性在audio标签中大部分都能够使用, 并且功能都一样 只不过有3个属性不能用, heig ...

  6. WinForm 进度条

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. DWZ富客户端框架(jQuery RIA framework)

    该OA项目前端采用的是DWZ框架来进行实现的. 本来想写点总结的,但发现真没啥好写的.中文的文档,到时候用到直接看文档就好.

  8. yield from

    一.yield 关于yield详细可参考我这篇文章 下面是一个带yield的生成器: def gen_yield(): while True: recv = yield do something wi ...

  9. JS_左边栏菜单

    需求: 要求实现左边栏菜单点击一下就弹开,其他的隐藏.再点击一下就隐藏. 最多只能有一个菜单的详细内容会显示出来. 三个菜单实现联动效果. 代码如下: 1 <!DOCTYPE html> ...

  10. Golang中进行reslice时的注意事项

    先看下面代码: package main import "fmt" func main() { slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8} ...