几个排序算法

 
 


冒泡排序

冒泡排序是比较简单的排序方法,它的思路是重复的走过要排序的序列,一次比较两个元素,如果顺序错误,就交换元素的位置,直到没有元素需要交换位置。

原 始 6 1 8 5 9 7
第一次 1 6 8 5 9 7
第二次 1 6 8 5 9 7
第三次 1 6 5 8 9 7
第四次 1 6 5 8 9 7
第五次 1 6 5 8 7 9

……

第N次 1 5 6 7 8 9

代码实现:

1.lst = [6,1,8,5,9,7]
2.for i in range(len(lst)-1):
3. for j in range(len(lst)-1):
4. if lst[j] > lst[j+1]:
5. tmp = lst[j]
6. lst[j] = lst[j+1]
7. lst[j+1] = tmp
8.print lst


选择排序

选择排序是从等待排序的数组里选择一个最小(或者最大)的元素,拿出来放入新的数组,直到取出全部元素。

原 始 6 1 8 5 9 7 3
第一次 1 6 8 5 9 7 3
第二次 1 3 8 5 9 7 6
第三次 1 3 5 8 9 7 6
第四次 1 3 5 6 9 7 8
第五次 1 3 5 6 7 9 8
第六次 1 3 5 6 7 8 9

每一次排序后最小的数组放在已排序的序列的最后

实现代码

1.lst = [6,1,8,5,9,7,3]
2.for i in range(len(lst)):
3. tmp = lst[i]
4. pos = i
5. for j in range(i+1,len(lst)):
6. if tmp > lst[j]:
7. tmp = lst[j]
8. pos = j
9. a_tmp = lst[i]
10. lst[i] = tmp
11. lst[pos] = a_tmp
12.
13.print lst


插入排序

插入排序是一种简单直观的排序算法,原理是通过构建有序序列,对于未排序的数据,在已排序的序列中从后想前扫描,找到相应位置后插入。插入排序通常采用in-place排序,即 只需要用到O(1) 的额外空间的排序。

算法描述:

  1. 从第一个元素开始,记该元素已经排序,
  2. 获取下一个元素作为新元素,在已经排序的序列中,从后向前扫描
  3. 如果该元素(已排序的序列中的元素)大于新元素,,则将该元素移到下一位置
  4. 重复步骤3, 直到找到已排序的元素小雨或等于新元素的位置
  5. 将心元素插入该位置
  6. 重复步骤2 ~步骤5 ,直到排序完成

在排序时,如果元素比较的操作代价比较大,可以采用二分查找,来减少操作。
实现代码:

1.lst = [6,1,8,5,9,7,2,4,6,9,2,32,45,76,8,3,3,4]
2.
3.for i in range(len(lst)):
4. for j in range(i,0,-1):
5. if lst[j-1] >lst[j]:
6. tmp = lst[j-1]
7. lst[j-1] = lst[j]
8. lst[j] = tmp


快速排序 quick sort

又称 划分交换排序;排序n个元素,需要Ο(n log n)次比较 ,最坏情况时需要,Ο(n2)次比较,但这种状况并不常见。

设 有序列 lst = [3,0,1,8,7,2,5,4,9,6] , i= 0 j=9 k = lst[0]

0 1 2 3 4 5 6 7 8 9
3 0 1 8 7 2 5 4 9 6
2 0 1 8 7 3 5 4 9 6
2 0 1 3 7 8 5 4 9 6
2 0 1 3 7 8 5 4 9 6
  1. 以3为基准,从右向左找比 3 小的值 ,j–
  2. 找到第一个小于三的数字2, lst[i] lst[j]交换位置;
  3. 从左向右找第一大于3的数字 8 ,交换 lst[i] lst[j]位置 i++

    1. 继续从右向左找比3小的数字,直到 i==j 此时第一趟 完成,3的当前位置为正确位置
  4. 此时大序列可分为两个小序列
    sub_lst_01 = [2,0,1]
    sub_lst_01 = [7,8,5,4,9,6]
    按照第一趟排序的规则 对两个子序列进行排序,直到所有子序列长度为1。
2 0 1
1 0 2

以2为基准,从右向左找比2小的值,找到数字1 比2小,交换两者位置
此时从左向右找比2大的数字,未找到,2的位置为排序后的正确位置

1 0
0 1

以1为基准,从右向左找比1小的数字,找到0比1小,交换两者位置
从左向右找比1 大的数字,未找到,1的位置为排序后的正确位置
0|
-|
此时序列只剩0 ,长度为1 ,0 的位置为排序后的正确位置

7 8 5 4 9 6
6 8 5 4 9 7
6 7 5 4 9 8
6 4 5 7 9 8
. . . . . .
5 4 6 . 8 9
5 4 . . . .
4 5 6 7 8 9
  1. 以7为基准,从右向左找到比7小的数字6,交换两者位置
  2. 从左向右查找到比7大的数字8 交换两者位置
  3. 从右向左找到比7小的数字4,交换两者位置
  4. 从左向右查找到比7大的数字,未找到,则7的位置为排序后的正确位置
    产生两个子序列 [6,4,5] [8,9]

重复以上操作,直到所有的序列排序完成。

 
 

几个排序算法的python实现的更多相关文章

  1. 八大排序算法的 Python 实现

    转载: 八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个 ...

  2. 常用排序算法的python实现和性能分析

    常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...

  3. 十大经典排序算法总结 (Python)

    作业部落:https://www.zybuluo.com/listenviolet/note/1399285 以上链接是自己在作业部落编辑的排序算法总结- Github: https://github ...

  4. 一些排序算法的Python实现

    ''' Created on 2016/12/16 Created by freeol.cn 一些排序算法的Python实现 @author: 拽拽绅士 ''' '''值交换''' def swap( ...

  5. 基本排序算法的Python实现

    本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序,计数排序.希望大家回顾知识的时候也能从我的这篇文章得到帮助. 为了防止误导读者,本文所有概念性 ...

  6. 经典排序算法及python实现

    今天我们来谈谈几种经典排序算法,然后用python来实现,最后通过数据来比较几个算法时间 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据 ...

  7. python基础===八大排序算法的 Python 实现

    本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...

  8. 八大排序算法---基于python

    本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 ...

  9. 十大经典排序算法(python实现)(原创)

    个人最喜欢的排序方法是非比较类的计数排序,简单粗暴.专治花里胡哨!!! 使用场景: 1,空间复杂度 越低越好.n值较大: 堆排序 O(nlog2n) O(1) 2,无空间复杂度要求.n值较大: 桶排序 ...

  10. 十大经典排序算法的python实现

    十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序.包括:冒泡排序.选择排序.归并排序.快速 ...

随机推荐

  1. Oracle的不完全恢复

    一.不完全恢复特性 1.不完全恢复 不完全恢复仅仅是将数据恢复到某一个特定的时间点或特定的SCN,而不是当前时间点.不完全恢复会影响整个数据库,需要在MOUNT状  态下进行.在不完全恢复成功之后,通 ...

  2. 从零搭建mongo分片集群的简洁方法

    一.目录 1.mongo路径,config数据路径,shard数据路径

  3. python 学习中遇到的问题

    一.安装pip中遇到的问题. 出现错误:ImportError:DLL load failed :%1不是有效的win32应用程序 出现问题解答: 主要是由于安装的python版本和所下载的安装包版本 ...

  4. 基于讯为4412开发板的Android开发流程

    讯为4412开发板  使用三星2410芯片,基于arm9架构,由于自己电脑硬件的局限,只能跑Android4.0.3系统. 1.Uboot这个直接使用官方镜像烧写就可以了,一般情况不用去重复烧写. 略 ...

  5. C语言输出字符串

    在VS2012中,使用gets_s()方法,其中第二个参数可以用sizeof(...)代替.例子代码如下: #include <stdio.h> int main( ) { ]; gets ...

  6. 类库、委托、is as运算符、泛型集合

    类库: 说白了,就是让别人调用你写的方法,并且不让别人看到你是怎么实现的. 如果有功能你不会做,需要别人帮忙,那么你的同事可以帮你写好一个类,然后你来调用这个类中的方法,完成你的项目. 1.C#源代码 ...

  7. Java里正则表达式

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表 ...

  8. uva 1660 & poj 1966(点连通度)

    Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4267   Accepted: 2003 ...

  9. [转]不正当使用HashMap导致cpu 100%的问题追究

    以前项目中遇到类似业务,但使用的是CurrentHashMap,看到这篇文章,转载记录,警示自己. 以下内容转自: 转载自并发编程网 – ifeve.com(http://ifeve.com/hash ...

  10. spring boot 初试,springboot入门,springboot helloworld例子

    因为项目中使用了spring boot ,之前没接触过,所以写个helloworld玩玩看,当做springboot的一个入门例子.搜索 spring boot.得到官方地址:http://proje ...