python数据结构学习笔记-2016-11-24-01-快速排序

来源:互联网 发布:c语言编程简单的小游戏 编辑:程序博客网 时间:2024/04/29 18:39

        12.2 快速排序

        快速排序(quick sort)仍旧是采用分治法,该排序算法按照选定的主键(pivot key)将序列分成两部分。此外,该算法不需要使用临时数组。

        12.2.1 算法描述

        首先是选定第一个元素作为主键,将序列分成两部分,分别为L和G,L是小于主键的部分,G是大于主键的部分。其次,对L和G分别重复上述过程,一直到不能再分为止。最后,同归并算法一样,将分出来的子组排序后重新组合,返回原序列的排序序列。



        12.2.2 实现

         快速排序实现的代码如下:

#-*-coding: utf-8-*-# 实现快速排序# 包装函数def quickSort(theSeq):    n = len(theSeq)    recQuickSort(theSeq, 0, n-1)def recQuickSort(theSeq, first, last):    if first >= last:        return     else:        pivot = theSeq[first] # 选定主键        pos = partitionSeq(theSeq, first, last) # 分割序列        # 进入递归部分        recQuickSort(theSeq, first, pos-1) # 对小于主键的部分进行操作        recQuickSort(theSeq, pos+1, last) # 对大于等于主键的部分进行操作# 操作序列的分割,主要是操作left和right两个标记,将小于主键的元素移至左侧,将大于主键的元素移至右侧def partitionSeq(theSeq, first, last):    pivot = theSeq[first] # 选定主键    left = first + 1 # left从第二个元素开始    right = last # right从最后一个元素开始    while left <= right: # 保持left小于right        while left < right and theSeq[left] < pivot: # 确保left指向的元素小于主键            left += 1        while right >= left and theSeq[right] >= pivot: # 确保right指向的元素大于等于主键            right -= 1        if left < right: # 前面两个循环退出的原因有left > right或者theSeq[left] >= pivot以及theSeq[right] < pivot,既然假定left < right,两侧必然有元素错位,将此时两元素交换位置即可            theSeq[left], theSeq[right] = theSeq[right], theSeq[left]    if right != first: # 确定主键在排序中应有的位置        theSeq[first] = theSeq[right]        theSeq[right] = pivot    return right
         在这段代码中,partitionSeq()函数理解有点费劲。这一函数负责对序列分割,我们拿一个例子来说明。

         选定第一个元素10,作为主键。在最开始,left和right分别指向元素23和13。


         此时left指向的23大于主键10,跳出第一个内层循环,right指向的13大于主键10,继续向左移动,直至找到一个小于主键的元素或者碰到left,即:


        这时候left指向了一个大于主键的元素,而right指向了一个小于主键的元素,并且left < right,将两者交换。


        将left和right继续移动,


         交换



        继续移动left和right,


        这时候出现了left > right的情况,而left走过的部分,其元素均小于主键,right走过的部分,其元素均大于主键,因此跳出外层循环。将主键与此时right指向的元素交换位置,即:


        此时,就完成了将一个序列按照选定的主键分割成两部分,小于主键的元素在主键的左侧,大于等于主键的元素在主键的右侧。


       12.2.3 效率分析

        快速排序在平均情况下的时间复杂度是O(n log n),在最坏情况下是O(n²)。


0 0
原创粉丝点击