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 ...
随机推荐
- Spring Cloud学习笔记【四】断路器Hystrix
雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因 “服务提供者” 的不可用导致 “服务消 ...
- Android 4.3 系统裁剪——删除不使用的app及添加自己app
删除不使用的apk 系统自带的app位置是在/android4.3/packages/apps 以下是一些APP作用分析: | |– BasicSmsReceiver | |– Bluetooth ( ...
- HDU 3555 Bomb(数位DP模板啊两种形式)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...
- scikit-learn:3.2. Grid Search: Searching for estimator parameters
參考:http://scikit-learn.org/stable/modules/grid_search.html GridSearchCV通过(蛮力)搜索參数空间(參数的全部可能组合).寻找最好的 ...
- JAVA并发-为现有的线程安全类添加原子方法
JAVA中有许多线程安全的基础模块类,一般情况下,这些基础模块类能满足我们需要的所有操作,但更多时候,他们并不能满足我们所有的需要.此时,我们需要想办法在不破坏已有的线程安全类的基础上添加一个新的原子 ...
- 英语影视台词---三、Cinema Paradiso
英语影视台词---三.Cinema Paradiso 一.总结 一句话总结:天堂电影院 1.Alfredo: No, Toto. Nobody said it. This time it's all ...
- PHP写文件到指定位置
<?php $fp = fopen("output.json", "r+"); $flag = fseek($fp, -3, SEEK_END); if( ...
- 教你破解隔壁妹子wifi密码,成功率高达90%
破解wifi密码听起来很复杂,实际上也不是非常的复杂,今天教大家如何破解隔壁妹子的wifi密码. 首先声明:本教程只用于技术交流,请勿用于非法用途.请严格遵循相关法律法规.为了保护本例中被破解密码者信 ...
- 【Henu ACM Round#15 C】 A and B and Team Training
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举第一种方法. 剩下的全都个第二种方法. 看看能组成多少个队伍就可以了. [代码] #include <bits/stdc+ ...
- CCF模拟题 最优灌溉
最优灌溉 时间限制: 1.0s 内存限制: 256.0MB 问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉. 为了灌溉,雷雷需 ...