python 几个简单算法详解
一、冒泡排序
基本思想:它的思路很有特点循环,两两向后比较。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
#冒泡排序
# def bubble_sort(li):
# for i in range(len(li)-1): #走一趟,循环的次数
# for j in range(len(li)-i-1): #有序列为,len(li)-i,去掉有序不循环
# if li[j]>li[j+1]: #如果后一个数大,那就交换
# li[j],li[j+1]=li[j+1],li[j]
二、选择排序
基本思想:从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。
选择排序
def select_sort(li):
for i in range(len(li)-1): #循环趟
min_loc=i #设置i为最小下标
for j in range(1+i,len(li)-1): #循环无序区
if li[min_loc]>li[j]: #如过不是最小值,就换下标
min_loc=j
if min_loc!=i: #如果下标不是原来的值,就互换
li[i],li[min_loc]=li[min_loc],li[i]
三、插入排序
基本思想:将列表分为有序区和无序区两个部分,最初有序区只有一个元素,.每次从无序区选择一个元素,插入到无序区的位置,直到无序区变空.
# 插入排序
def insert_sort(li):
for i in range(1, len(li)): #走趟,从第一个数开始
tmp = li[i] #tmp为无序区手中拿的那张牌
j = i - 1 #j 为有序区的右侧第一张牌
while j >= 0 and tmp < li[j]:
print(li)
#当 有序区至少一张牌,且有序区右侧第一张牌大于需要插入的牌时
li[j + 1] = li[j] #有序区右侧第一张牌继续向右移位,
j = j - 1 #有序区向右移一位,继续让手牌去比较
li[j + 1] = tmp #当手牌不比左边的牌大了,将手牌插入
四、快速排序
基本思想:取一个元素p(第一个元素),使p归位,,,列表被分为两部分,左边都比p小,右边都比p大,.递归完成排序
# 取一个元素p(第一个元素),使元素p归位;
# 列表被p分成两部分,左边都比p小,右边都比p大; 第一种实现方式:
# def partition(data, left, right): #传入,左右下标
# tmp = data[left] #取第一个元素
# while left < right: #如果左<右
# while left < right and data[right] >= tmp: #左<右 的同时 右边的值>=第一个元素
# right -= 1 #右边向左移
# data[left] = data[right] #不大于的时候,左边的值换到右边来
# while left < right and data[left] <= tmp: #左<右 的同时 左边的值<=第一个元素
# left += 1 #左边向左移动
# data[right] = data[left] #不大于的时候,右边的值换到左边来
# data[left] = tmp #这时候左右下标应该指向一个,就确定了tmp的位置
# return left
# # 递归完成排序。
# def quick_sort(data, left, right):
# if left < right:
# mid = partition(data, left, right)
# quick_sort(data, left, mid - 1)
# quick_sort(data, mid + 1, right)
# arr = [1, 4, 7, 1, 5, 5, 3, 85, 34, 75, 23, 75, 2, 0]
# quick_sort(arr,0,len(arr)-1)
# print(arr)
# 第二种方式 def quickSort(array):
if len(array) < 2: #如果数组就一个值,那就直接返回
return array
else:
pivot = array[0] #拿到第一个值,
less = [i for i in array[1:] if i < pivot] #比这个值小的都放左边,
greater = [j for j in array[1:] if j > pivot] #比这个值大的都扔右边
return quickSort(less) + [pivot] + quickSort(greater) #返回这个数组 print(quickSort([1,5,2,6,9,3]))
五、归并排序
基本思想:假设我们有一个没有排好序的序列(14,12,15,13,11,16),那么首先我们使用分割的办法将这个序列分割成一个个已经排好序的子序列。然后再利用归并的方法将一个个的子序列合并成排序好的序列。分割和归并的过程可以看下面的图例。这样通过先递归的分解数列,再合并数列就完成了归并排序。
def merge(left,right):
result = []
while left and right: #当两边都有值的时候
result.append(left.pop(0) if left[0] <= right[0] else right.pop(0))
while left: #只有Left有值的时候
result.append(left.pop(0))
while right: #只有right有值的时候
result.append(right.pop(0)) return result def mergeSort(relist):
if len(relist) <= 1:
return relist
mid_index = len(relist)//2 #先将列表查分为两部分
left = mergeSort(relist[:mid_index]) # 递归拆解的过程
right = mergeSort(relist[mid_index:])
return merge(left,right) # 合并的过程 print(mergeSort([1,5,2,9]))

python 几个简单算法详解的更多相关文章
- 信息安全-1:python之playfair密码算法详解[原创]
转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere ...
- 机器学习经典算法详解及Python实现--基于SMO的SVM分类器
原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector ...
- SILC超像素分割算法详解(附Python代码)
SILC算法详解 一.原理介绍 SLIC算法是simple linear iterative cluster的简称,该算法用来生成超像素(superpixel) 算法步骤: 已知一副图像大小M*N,可 ...
- 第三十一节,目标检测算法之 Faster R-CNN算法详解
Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal network ...
- Python中的高级数据结构详解
这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...
- 【目标检测】Faster RCNN算法详解
Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal network ...
- Python安装、配置图文详解(转载)
Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- kmp算法详解
转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...
随机推荐
- 用beam实现连接kafka和elasticSearch示例 在flink平台运行
示例实现beam用java编程,监听kafka的testmsg主题,然后将收取到的单词,按5秒做一次统计.结果输出到outputmessage 的kafka主题,同时同步到elasticSearch. ...
- C++回顾day03---<类型转换>
一:C++类型转换 (一)static_cast<>() 静态类型转换:基本类型可以转换但是指针类型不允许.可以进行隐式类型转换 double n=1.23 int m=static_ca ...
- jvisualvm安装visualgc插件
jdk1.7自带jvisualvm可以对java应用进行监控.其中有个插件visualgc可以查看jvm垃圾回收的具体信息.安装插件的步骤是打开jvisualvm,点击工具->插件,在可用插件列 ...
- GO 基础
基本语法练习 打印 乘法表 package main import ("fmt") func main(){ for n:=1;n<=9;n++{ for m:=1;m< ...
- 怎样以快速样式的方式在word文档中生成以下多级自动编号
本篇博文简单介绍一下在word中利用快速样式生成多级编号的方法. 一.自定义多级列表格式: 1.点击,开始--段落--多级列表--定义新的多级列表: 2.设置一级编号: (1)在"此级的编号 ...
- Vue-cli 模拟数据库
vue-cli2.x 版本开发: 新版在build目录下的webpack.dev.conf.js配置本地数据访问: 1,在const portfinder = require(‘portfinder’ ...
- 【Java编程思想笔记】反射
文章参考:学习网站 how2java.cn 参考博客:(敬业的小码哥)https://blog.csdn.net/sinat_38259539/article/details/71799078 (青色 ...
- OGG微服务架构入门
数据复制任务路线图 设置数据复制必须执行许多任务. 下表列出了构建分发路径的阶段. Task Description 运行Oracle GoldenGate Configuration Assista ...
- vue中怎么实现获取当前点击对象this
应用场景 在评论列表中,有很多条评论(通过循环出来的评论列表),评论的文字有多跟少,默认展示2行超出显示点击查看更多,,要点击查看更多对当前的这条评论进行全部评论展示! 问题描述 要是在传统的点击事件 ...
- Lua的线程和状态
[那不是真的多线程] Lua不支持真正的多线程,这句话我在<Lua中的协同程序>这篇文章中就已经说了.根据我的编程经验,在开发过程中,如果可以避免使用线程,那就坚决不用线程,如果实在没有更 ...