Python学习(三) 八大排序算法的实现(下)

本文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()  
时间: 2024-12-26 04:31:45

Python学习(三) 八大排序算法的实现(下)的相关文章

Python 排序算法的实现

冒泡排序: 1 def bubble(l): 2 length = len(l) 3 for i in range(length): 4 for j in range(i+1, length): 5 if l[i] > l[j]: 6 l[i], l[j] = l[j], l[i] 7 print l 选择排序: 1 def select(l): 2 length = len(l) 3 for i in range(length): 4 minn = i 5 for j in range(i+1

探讨排序算法的实现

排序算法是我们工作中使用最普遍的算法,常见的语言库中基本都会有排序算法的实现,比如c标准库的qsort,stl的sort函数等.本文首先介绍直接插入排序,归并排序,堆排序,快速排序和基数排序等比较排序算法,然后介绍计数排序,基数排序等具有线性时间的排序算法.本文主要讨论算法的实现方法,并不会过多介绍基本理论. 评价一个排序算法优劣适用与否,一般需要从三个方面来分析 时间复杂度.用比较操作和移动操作数的最高次项表示,由于在实际应用中最在乎的是运行时间的上限,所以一般取输入最坏情况的下的运行时间作为

七种排序算法的实现和总结

最近把七种排序算法集中在一起写了一遍. 注释里有比较详细的说明. 1 /*排序算法大集合**/ 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 6 //------------------快速排序------------------// 7 /* 8 核心: 9 如果你知道多少人该站你前面,多少人站你后面,你一定知道你该站哪个位置. 10 算法: 11 1.选取分界数,参考这个分界数,

软考笔记第六天之各排序算法的实现

对于前面的排序算法,用c#来实现 直接插入排序: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序.第一趟比较前两个数,然后把第二个数按大小插入到有序表中: 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中:依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程.直接插入排序属于稳定的排序,最坏时间复杂性为O(n^2),空间复杂度为O(1).直接插入排序是由两层嵌套循环组成的.外层循环标识并决定待比较的数值.内层循环为待比较数值确定其最终位

常见排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)

这篇博客主要实现一些常见的排序算法.例如: //冒泡排序 //选择排序 //简单插入排序 //折半插入排序 //希尔排序 //归并排序 //双向的快速排序 //单向的快速排序 //堆排序 对于各个算法的实现原理,这里不再多说了,代码中注释较多,结合注释应该都能理解算法的原理,读者也可自己google一下.另外,注释中有很多点,比如边界条件.应用场景等已经用 * 标记,* 越多,越应该多注意. 下面是实现: //冒泡排序 void BubbleSort(int *arr, int n) { if(

Python之基本排序算法的实现

1 import cProfile 2 import random 3 class SortAlgorithm: 4 def __init__(self,unsortedlist=[]): 5 self.unsortedlist = unsortedlist or [i for i in random.sample(range(10000),100)] 6 self.length = len(self.unsortedlist) 7 8 def bubble_sort(self): 9 '''

Python - 几种排序算法的实现

直接插入.选择排序.冒泡排序.快速排序.……归并排序.基数排序.希尔.堆排序. 直接插入: 思想是:1.将数据序列分成两部分,前一部分是有序的,后面一部分是无序的. 2.将无序变有序,首先从第一开始,然后第一,第二比较后排序,此时这两位就是有序的了:然后从无序的队列中取出第三位和第二位比较,然后他们中矮的再和第一位比较,此时三位是有序的: 然后再取出第四位,和前面的比较……,一直到最后一位比较. def insert_sort(aList): n = len(aList) for i in ra

Python学习三---序列、列表、元组

一.序列 1.1.序列概念 pythn中最基本的数据结构是序列(sequence). 序列中每个元素被分配一个序号-元素索引,第一个索引是0,第二个是1,以此类推.类似JAVA中数组和集合中的下标. 从后向前,最后一个索引是-1,-2,.... python包含6种内建序列.最常用的两种类:列表和元组,其它内奸序列类型有字符串.Unicode字符串.buffer对象和xrange对象. 列表和元组的主要区别在于,列表可以修改,元组不能修改. 添加元素就用列表. 由于 一些原因不能修改时就用元组.

各种排序算法的实现、总结

排序算法 比较排序 2.非比较排序 计数排序.基数排序 排序算法实现 假定序列array[10]={73,22,93,43,55,14,28,65,39,81}  (以升序为例) 直接插入排序 直接插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 1 void Insertsort(int* array,size_t n) 2 { 3 assert(array); 4 for (size_t i = 0; i < n-1; i++) 5 { 6 in