几个排序算法的python实现
几个排序算法
几个排序算法
冒泡排序
冒泡排序是比较简单的排序方法,它的思路是重复的走过要排序的序列,一次比较两个元素,如果顺序错误,就交换元素的位置,直到没有元素需要交换位置。
| 原 始 | 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) 的额外空间的排序。
算法描述:
- 从第一个元素开始,记该元素已经排序,
- 获取下一个元素作为新元素,在已经排序的序列中,从后向前扫描
- 如果该元素(已排序的序列中的元素)大于新元素,,则将该元素移到下一位置
- 重复步骤3, 直到找到已排序的元素小雨或等于新元素的位置
- 将心元素插入该位置
- 重复步骤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 |
- 以3为基准,从右向左找比 3 小的值 ,j–
- 找到第一个小于三的数字2, lst[i] lst[j]交换位置;
- 继续从右向左找比3小的数字,直到 i==j 此时第一趟 完成,3的当前位置为正确位置
- 此时大序列可分为两个小序列
sub_lst_01 = [2,0,1]
sub_lst_01 = [7,8,5,4,9,6]
按照第一趟排序的规则 对两个子序列进行排序,直到所有子序列长度为1。
从左向右找第一大于3的数字 8 ,交换 lst[i] lst[j]位置 i++
| 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 |
- 以7为基准,从右向左找到比7小的数字6,交换两者位置
- 从左向右查找到比7大的数字8 交换两者位置
- 从右向左找到比7小的数字4,交换两者位置
- 从左向右查找到比7大的数字,未找到,则7的位置为排序后的正确位置
产生两个子序列 [6,4,5] [8,9]
重复以上操作,直到所有的序列排序完成。
几个排序算法的python实现的更多相关文章
- 八大排序算法的 Python 实现
转载: 八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个 ...
- 常用排序算法的python实现和性能分析
常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...
- 十大经典排序算法总结 (Python)
作业部落:https://www.zybuluo.com/listenviolet/note/1399285 以上链接是自己在作业部落编辑的排序算法总结- Github: https://github ...
- 一些排序算法的Python实现
''' Created on 2016/12/16 Created by freeol.cn 一些排序算法的Python实现 @author: 拽拽绅士 ''' '''值交换''' def swap( ...
- 基本排序算法的Python实现
本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序,计数排序.希望大家回顾知识的时候也能从我的这篇文章得到帮助. 为了防止误导读者,本文所有概念性 ...
- 经典排序算法及python实现
今天我们来谈谈几种经典排序算法,然后用python来实现,最后通过数据来比较几个算法时间 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据 ...
- python基础===八大排序算法的 Python 实现
本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...
- 八大排序算法---基于python
本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 ...
- 十大经典排序算法(python实现)(原创)
个人最喜欢的排序方法是非比较类的计数排序,简单粗暴.专治花里胡哨!!! 使用场景: 1,空间复杂度 越低越好.n值较大: 堆排序 O(nlog2n) O(1) 2,无空间复杂度要求.n值较大: 桶排序 ...
- 十大经典排序算法的python实现
十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序.包括:冒泡排序.选择排序.归并排序.快速 ...
随机推荐
- Hbase WAL线程模型源码分析
版权声明:本文由熊训德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/257 来源:腾云阁 https://www.qclo ...
- SPSS数据分析——t检验
SPSS中t检验全都集中在分析—比较均值菜单中.关于t检验再简单说一下,我们知道一个统计结果需要表达三部分内容,即集中性.变异性.显著性. 集中性的表现指标是均值变异的的表现指标是方差.标准差或标准误 ...
- android log
from 点击打开链接 使用Android logcat 对我们开发.调试Android程序有很大的帮助!通过logcat,我们可以非常方便的了解到程序的执行情况,判断出错代码位置. 最简单的log ...
- C#导出csv文件 支持中文的解决方案
#region 导出CSV下载 string exportFileName = "Export" + DateTime.Now.ToString("yyyyMMddHHm ...
- 【html5】常见标签使用说明(持续更新)
说明: 所谓常见,是指我在优秀网页源码中见到的. 1.viewport 我见到的时候是这样: <meta name="viewport" content="widt ...
- Exit函数
1函数: exit() 函数名: exit() 所在头文件:stdlib.h 功 能: 关闭所有文件,终止正在执行的进程. exit(1)表示异常退出.这个1是返回给操作系统的. exit(x)(x不 ...
- javascript错误处理与调试(转)
JavaScript 在错误处理调试上一直是它的软肋,如果脚本出错,给出的提示经常也让人摸不着头脑. ECMAScript 第 3 版为了解决这个问题引入了 try...catch 和 throw 语 ...
- C# 文件夹加密
可以加密文件内容,也可以对文件夹本身进行加密,本文对文件夹加密. 一.指定或生成一个密钥 1)指定的密钥 /// <summary> /// 密钥,这个密码可以随便指定 /// </ ...
- Nodejs学习笔记(一)--- 简介及安装Node.js开发环境
目录 学习资料 简介 安装Node.js npm简介 开发工具 Sublime Node.js开发环境配置 扩展:安装多版本管理器 学习资料 1.深入浅出Node.js http://www.info ...
- java 自带md5加密
package test; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; pub ...