一、冒泡排序

基本思想:它的思路很有特点循环,两两向后比较。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

#冒泡排序
# 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. 信息安全-1:python之playfair密码算法详解[原创]

    转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere ...

  2. 机器学习经典算法详解及Python实现--基于SMO的SVM分类器

    原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector  ...

  3. SILC超像素分割算法详解(附Python代码)

    SILC算法详解 一.原理介绍 SLIC算法是simple linear iterative cluster的简称,该算法用来生成超像素(superpixel) 算法步骤: 已知一副图像大小M*N,可 ...

  4. 第三十一节,目标检测算法之 Faster R-CNN算法详解

    Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal network ...

  5. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  6. 【目标检测】Faster RCNN算法详解

    Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal network ...

  7. Python安装、配置图文详解(转载)

    Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...

  8. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  9. kmp算法详解

    转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...

随机推荐

  1. OpenLayers学习笔记(八)— 类似比例尺的距离环(二)

    openlayers 3 地图上创建一个距离环,始终以地图中心为中心,每个环之间的距离类似比例尺,随地图缩放而变化. 添加具有覆盖整个范围的特征的虚拟层,其可以被设置为围绕地图中心的环. 这篇是上一篇 ...

  2. zsh fg: no job control in this shell.

    图片的上面就是将一个应用按Ctrl+Z,把任务放到后台里面.没法fg将任务回到前台运行. 在.zshrc中添加set -m. 具体原因不明.我切换到root用户里,没有出现这个问题.将我的.zshrc ...

  3. c 判断文件或文件夹是否存在,多种方法, 为什么从一开始就不直接来个统一的呢?

    具体内容,请看: https://blog.csdn.net/u012494876/article/details/51204615 判断文件或文件夹是否存在,竟然有这么多方法: GetFileAtt ...

  4. jpg、png格式的图片转换成webp后颜色失真的问题

    今天简单的试用了一下 cweb.exe 将 jpg, png 格式的图片转换成 webp 格式. 我今天下载的是当前最新版:1.0.0 cwebp 3.jpg  -q 85 -o 3.webp 发现图 ...

  5. laravel 图片验证码

    今天看见一个网站登录页面有个图片验证码,想想自己以前好像真没弄过这个玩意,正好现在有时间,准备用laravel来弄个图片验证码出来,不多BB,直接上代码 1.直接使用别人封装好的,composer下载 ...

  6. 如何将JPG格式的图片转换成PNG格式

    study from : https://jingyan.baidu.com/article/6079ad0e63a4fc28ff86db37.html

  7. 【.net】未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法

    #错误描述: 在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错: “未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序” # ...

  8. MessageFormat的用法,java动态替换String字符串中的占位符

    import java.text.MessageFormat; import java.util.GregorianCalendar; import java.util.Locale; public ...

  9. 针对主机CPU idle性能情况需求脚本编写

    [环境介绍] 系统环境:Linux + osw + python 2.7.10 [背景描述] 需求:当系统服务器出现性能告警的时候,需要定位具体的时间点来进行有针对性的去查询产生的问题.OSW提供了很 ...

  10. JAVA写JSON的三种方法,java对象转json数据

    JAVA写JSON的三种方法,java对象转json数据 转自:http://www.xdx97.com/#/single?bid=5afe2ff9-8cd1-67cf-e7bc-437b74c07a ...