一、冒泡排序

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

#冒泡排序
# 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. Django自定义分页

    分页 自定义分页 稳扎稳打版 def book(request): # 从URL取参数(访问的页码) page_num = request.GET.get("page") try: ...

  2. 初识 go 语言:数据类型

    目录 数据类型 指针 结构体 数组 切片 切片的方法 映射 函数闭包 结束语 前言: go语言的第三篇文章,主要讲述go语言中的数据类型,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示 ...

  3. LOJ#2553 暴力写挂

    题意:给定两棵树T1,T2,求d1[x] + d1[y] - d1[lca1(x, y)] - d2[lca2(x, y)]的最大值. 解:考虑把上面这个毒瘤东西化一下.发现它就是T1中x,y到根的路 ...

  4. JMeter 的调式工具

    任何的编程工具都会相应的调式工具,JMeter的调式 工具主要有五种: 1.查看结果树:含请求信息.响应信息等 2.HTTP 镜像服务器:HTTP Mirror Server用于查看请求信息 3.De ...

  5. Django_restframework+vue解决跨域问题

    1. 安装 pip3 install django-cors-headers 2.在settings.py里设置 INSTALLED_APPS = ( ... 'corsheaders', ... ) ...

  6. 缓存服务—Redis

    Redis 简介Redis 是一个开源(BSD 许可)的.内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 为什么要用 Redis 在高并发场景下,如果需要经常连接结果变动频繁的数据库, ...

  7. MVC控制器返回一个list 视图接收

    控制器 public ActionResult InfoFrame() { List<Users> list = new List<Users>(); if (Session[ ...

  8. SpringMVC中的数据绑定(也就是参数的接收)

    spirngMVC中的数据绑定类型,分为默认数据类型,简单数据类型,pojo类型,包装的pojo类型,绑定数组类型,绑定集合类型,还有自定定义数据绑定. 例如默认数据类型的绑定@RequestMapp ...

  9. du---查看文件夹大小-并按大小进行排序

    使用df 命令查看当前磁盘使用情况: df -lh [root@gaea-dev-xjqxz-3 ~]$ df -lh Filesystem Size Used Avail Use% Mounted ...

  10. LOJ #556. 「Antileaf's Round」咱们去烧菜吧

    好久没更博了 咕咕咕 现在多项式板子的常数巨大...周末好好卡波常吧.... LOJ #556 题意 给定$ m$种物品的出现次数$ B_i$以及大小$ A_i$ 求装满大小为$[1..n]$的背包的 ...