几个排序算法

 
 


冒泡排序

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

原 始 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. centos7 安装mysql5.7.16

    1 下载地址http://dev.mysql.com/downloads/mysql/#downloads 2. 解压 -linux-glibc2.-x86_64.tar.gz 3.移动解压出来的文件 ...

  2. neon指令,注意事项

    1. vbic_s8 (int8x8_t a, int8x8_t b) 是  ~(ai & bi),一开始理解成  (~ai )& bi 导致出错 2.uint8x8_t vqshrn ...

  3. json 转换错误:JSON.parse expected property name or '}'

    错误原因: 格式要为: [ { "name":"张三", "age":"20" }, { "name" ...

  4. 如何编写android ANE

    1.编写AndroidAne.jar: a.编写SkyContext.java: import java.util.HashMap;import java.util.Map;import com.ad ...

  5. js javascript 模拟点击 超级链接点击 转

    转自:http://mo2g.com/view/42/ 我尝试过多次用jQuery模拟用户点击a标签的功能,但都没有成功,并且困扰了很久.前段时间的一次发呆,冒出了新的想法,于是就动手进行了测试. 先 ...

  6. ASP.NET MVC ActionResult的其它返回值

    一.ascx页面 场景:要返回代码片断,比如Ajax返回一个子页 我们先新建一个Action public ActionResult Ascx() { return PartialView(); } ...

  7. ios资源

    ios 资源 分类: ios开发2012-05-30 16:39 573人阅读 评论(0) 收藏 举报 ios文档calendar2010reference图像处理 学习过程当中查找到的资料,做一个记 ...

  8. cocos2d-x 中的坐标系

    cocos2d-x 中的坐标系是笛卡尔坐标系,向右为 x 轴正方向,向上为 y 轴正方向,以像素为单位 原点在屏幕左下角的坐标系叫世界坐标系,是整个游戏中的根基,直接添加到场景中的节点,设置的位置都是 ...

  9. Android - 动态调整ListView高度

    布局中,如果设计ListView的高度为包裹内容,那么ListView的高度是随着它的子条目的数量的变化而改变的, 这就可能会导致ListView下面的一些控件的位置也会随着ListView的高度的变 ...

  10. CodeForces 688A-Opponents

    题意: Arya在学校有n个敌人(一串含有0,1的数字表示),有一个游戏规则,如果当天这n个敌人全部出席("1"代表出席,),即这串数字全部为"1",则Arya ...