Python学习(三) 八大排序算法的实现(下)
本文Python实现了插入排序、基数排序、希尔排序、冒泡排序、高速排序、直接选择排序、堆排序、归并排序的后面四种。
1.高速排序
描写叙述
通过一趟排序将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列。
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.反复上述过程
代码实现
def quick_sort(lists):
if lists == []:
return []
else:
divide = lists[0]
lesser = quick_sort([x for x in lists[1:] if x<divide])
#链表推导式。返回值是由for或if子句之后的表达式得到的元素组成的链表
bigger = quick_sort([x for x in lists[1:] if x>=divide])
return lesser + [divide] + bigger
if __name__=="__main__":
lists = [19,-3,2,10,45,-34,17]
print quick_sort(lists)
2.直接选择排序
描写叙述
基本思想:第1趟,在待排序记录r1 ~ r[n]中选出最小的记录,将它与r1交换。第2趟,在待排序记录r2 ~ r[n]中选出最小的记录,将它与r2交换;以此类推,第i趟在待排序记录r[i] ~ r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完成。
代码实现
def select_order(lists):
length = len(lists)
for i in range(0,length):
min = i
for j in range(i+1,length):
if lists[min] > lists[j]:
min = j
lists[min],lists[i] = lists[i],lists[min]
return lists
if __name__ == '__main__':
lists = [12,13,15,9,16,14]
print select_order(lists)
3.堆排序
描写叙述
堆排序(Heapsort)是指利用堆积树(堆)这样的数据结构所设计的一种排序算法,它是选择排序的一种。能够利用数组的特点高速定位指定索引的元素。堆分为大根堆和小根堆。是全然二叉树。
大根堆的要求是每一个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。
在数组的非降序排序中。须要使用的就是大根堆,由于依据大根堆的要求可知,最大的值一定在堆顶。
利用了大顶堆堆顶元素最大的特点,不断取出最大元素,并调整使剩下的元素还是大顶堆。依次取出最大元素就是排好序的列表。
代码实现
def build_heap(lists):
count = len(lists)
for i in range(count//2-1,-1,-1):
adjust_heap(lists,i,count)
def adjust_heap(lists,i,n):
j = i*2 +1
while j < n:
if j+1 < n and lists[j]<lists[j+1]:
j +=1
if lists[i] > lists[j]:
break
lists[i],lists[j] = lists[j],lists[i]
i = j
j = i*2 + 1
#大顶堆排序
def heap_sort( lists ):
count = len( lists )
build_heap( lists )
#交换堆顶与最后一个结点,再调整堆
for i in range( count - 1, 0, -1 ):
lists[0], lists[i] = lists[i], lists[0]
adjust_heap( lists, 0, i )
return lists
lists = [-3, 1, 3, 0, 9, 7]
print heap_sort(lists)
4.归并排序
描写叙述
归并排序是建立在归并操作上的一种有效的排序算法,该算法是採用分治法(Divide and Conquer)的一个很典型的应用。
将已有序的子序列合并。得到全然有序的序列;即先使每一个子序列有序。再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并排序详细工作原理例如以下(如果序列共同拥有n个元素):
1. 将序列每相邻两个数字进行归并操作,形成个序列,排序后每一个序列包括两个元素
2. 将上述序列再次归并,形成个序列。每一个序列包括四个元素
3. 反复步骤2。直到全部元素排序完成
代码实现
def merge_sort(lists):
if len(lists)<=1:
return lists
left = merge_sort(lists[:len(lists)/2])
right = merge_sort(lists[len(lists)/2:len(lists)])
result = []
while len(left) > 0 and len(right)> 0:
if( left[0] > right[0]):
result.append(right.pop(0))
else:
result.append(left.pop(0))
if(len(left)>0):
result.extend(merge_sort(left))
else:
result.extend(merge_sort(right))
return result
def main():
lists = [2,11,55,33,32,64,18]
print merge_sort(lists)
if __name__=="__main__":
main()
Python学习(三) 八大排序算法的实现(下)的更多相关文章
- 基于python的几种排序算法的实现
#!usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2019/3/28 10:26 # @Author : Yosef-夜雨声烦 # @Email ...
- 排序算法的实现之Javascript(常用)
排序算法的实现之Javascript 话不多说,直接代码. 1.冒泡排序 1.依次比较相邻的两个数,如果前一个比后一个大,则交换两者的位置,否则位置不变 2.按照第一步的方法重复操作前length-1 ...
- 各类排序算法的实现C#版
using System;using System.CodeDom;using System.Collections.Generic;using System.Linq;using System.Ru ...
- [python学习] 语言基础—排序函数(sort()、sorted()、argsort()函数)
python的内建排序函数有 sort.sorted两个. 1.基础的序列升序排序直接调用sorted()方法即可 ls = list([5, 2, 3, 1, 4]) new_ls = sorted ...
- Javascript十大排序算法的实现方法
上一篇中,实现了Javascript中的冒泡排序方法,下面把剩余的九种排序算法实现 选择排序: var array = []; for(var i=0;i<100000;i++){ var x ...
- python排序算法的实现-插入
1.算法: 设有一组关键字{ K 1 , K 2 ,…, K n }:排序开始就认为 K 1 是一个有序序列:让 K 2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列:然后让 K ...
- Python之基本排序算法的实现
import cProfile import random class SortAlgorithm: def __init__(self,unsortedlist=[]): self.unsorted ...
- Java基础学习总结(28)——Java对各种排序算法的实现
这里总结下各种排序算法的java实现 冒泡排序 public class BubbleSort { publicstaticint[] bubbleSort(int[] array) { if(arr ...
- python排序算法的实现-快速排序
1. 算法描述: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区间只有一个数. 2.pyth ...
随机推荐
- Unity C# 关于设计模式的思考
一.当你的项目发现有如下问题之一时,就需要考虑重构代码,可能会有某种模式适合. 1.代码无法进行单元测试. 2.需求的变动总是导致代码的变动. 3.有重复代码的存在. 4.继承层次过多. 5.隐藏的依 ...
- 【习题 8-17 UVA - 11536】Smallest Sub-Array
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 尺取法. 考虑一个1..i的窗口. 里面在到达了i位置的时候恰好有1..k这些数字了. 为了更接近答案. 显然可以试着让左端点变成2 ...
- IIS 无法读取配置节"system.web.extensions",由于它缺少节声明
作者:jiankunking 出处:http://blog.csdn.net/jiankunking 今天在本地安装iis.搭建站点,应用程序的时候报错以下的错误: server错误 Internet ...
- POJ - 3415 Common Substrings(后缀数组求长度不小于 k 的公共子串的个数+单调栈优化)
Description A substring of a string T is defined as: T( i, k)= TiTi+1... Ti+k-1, 1≤ i≤ i+k-1≤| T|. G ...
- thinkphp里面的or查询
thinkphp里面的or查询 whereOr 方法 使用whereOr 方法进行OR 查询: Db::table('think_user') ->where('name','like','%t ...
- 初学Larevel 2014-08-21 11:24 90人阅读 评论(0) 收藏
添加第一个路由时就遇到了 404错误,查了一下说要这样才能 版权声明:本文为博主原创文章,未经博主允许不得转载.
- Python(三) 变量与运算符
一.什么是变量 变量 = [1,2] 二.变量的命名规则 字母,数字,下划线,首字母不能是数字 系统关键字 不能用在变量名中 保留关键字 区别大小写 a=1, a='1', a=(1,2), ...
- Linux常用下载软件
1.TransmissionTransmission是一个BitTorrent客户端软件,Ubunut默认自带的下载软件,它支持速度限制.制作种子.远程控制.磁力链接.数据加密.损坏修复.数据来源交换 ...
- 现实人脸识别性别之路----弄清楚train_test_split函数
'''train_test_split(trian_data,trian_target,test_size,random_state)各个参数表示的意义:trian_data表示被划分的样本特征集tr ...
- 彻底分析虚拟视频驱动vivi(三)
在Ubuntu系统中接上usb摄像头设备时,系统会自动安装对应的usb设备驱动程序.我们现在要使用自己编译的vivi驱动,该怎么办呢? 1.先安装系统自带的vivi驱动和它所依赖的所有驱动:sudo ...