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算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...
随机推荐
- vue之——从彩笔的进步之路
因为这个文章开的有点晚,不可能说从头教学vue的使用,所以大概还是记录一下我的学习路线吧: 一开始是想学一个前端框架,最后选择了vue,一开始是看了表严肃的vue课程,b站有,讲的相当好,就算打个小广 ...
- centos 下安装显卡驱动步骤
一. 先下载自己显卡对应的linux版本的驱动文件, 一般都是.run的一个文件. 二.如果是新安装的系统,先安装编译环境,gcc,kernel-devel,kernel-headers (联网) ...
- Linux-监控目录及文件
Linux-通过inotifywait监控目录及文件 inotifywait命令的使用此处就不写了:可以参考文章:https://www.cnblogs.com/martinzhang/p/41269 ...
- 字符串str的使用方法
参考:https://www.cnblogs.com/cookie1026/p/6048092.html #!/usr/bin/env python # -*- coding:utf- -*- s = ...
- python之shelve模块详解
一.定义 Shelve是对象持久化保存方法,将对象保存到文件里面,缺省(即默认)的数据存储文件是二进制的. 二.用途 可以作为一个简单的数据存储方案. 三.用法 使用时,只需要使用open函数获取一个 ...
- ios打包 上架 了解
苹果开发者中心 https://developer.apple.com/account 上架收费相关了解 https://www.jianshu.com/p/681f00a561ca ios打包 上 ...
- Beamer 中的页面链接
\documentclass[]{beamer} \usetheme{Madrid} \usenavigationsymbolstemplate{} \title{Main Title} \autho ...
- Gram 矩阵与向量到子空间的距离
设 $W$ 是 $n$ 维 Euclidean 空间 $V$ 的子空间, $\beta\in V$, 定义 $\beta$ 到 $W$ 的距离 $$\bex \rd (\beta,W)=|\bet ...
- @JsonView的使用,entity中指定向前台返回哪些字段
使用步骤: 1.使用接口来声明多个视图 2.在值对象的get方法上指定视图 3.在Controller方法上指定视图
- CRMEB客户管理+电商管理系统帮助文档,送给有需要的人
本项目还在不断开发完善中,如有建议或问题请言