算法导论:快速排序及其随机化版本

来源:互联网 发布:天猫美工职责 编辑:程序博客网 时间:2024/05/23 18:26

快速排序的描述

快速排序使用了分治思想,分为三个步奏完成


  1. 分解:数组array[p, r]分解为两个子数组array[p, q-1]和array[q+1, r],使得array[q]分别大于等于和小于等于两个数组里面的值。
  2. 解决:调用快速排序,对上面的两个子数组进行排序
  3. 合并:因为子数组都是原址排序,所以不需要合并操作。

下面的程序实现快速排序(python 2.x):

def quick_sort(array, p, r):    if p < r:        q = partition(array, p, r)        quick_sort(array, p, q-1)        quick_sort(array, q+1, r)

为了排序数组的全部元素,初始调用quick_sort(array, 0, len(array)-1).
数组的划分
算法的关键部分:partition()过程,实现对数组的原址排序。

def partition(array, p, r):    x = array[r]    i = p-1    for j in range(p, r):        if array[j] <= x:            i += 1            temp = array[i]            array[i] = array[j]            array[j] = temp    temp = array[i+1]    array[i+1] = array[r]    array[r] = temp    return i + 1

实验部分:
实验代码:

arr = [12, 8, 7, 1, 3, 5, 6, 4]print 'Before quick_sort:', arrquick_sort(arr, 0, len(arr)-1)print 'After  quick_sort:', arr

实验结果:
Before quick_sort: [12, 8, 7, 1, 3, 5, 6, 4]
After quick_sort: [1, 3, 4, 5, 6, 7, 8, 12]



快速排序的随机化版本

与始终采用array[r]作为主元的方法不同,随机抽样是从array[p..r]中随机选择一个元素作为主元。为达到这一目的,首先将array[r]与从array[p..r]中随机选取的一个元素交换。对上面的代码改动非常的小,只是添加了几行代码。上面的partition()函数还是会被继续使用。
def randomized_partition(array, p, r):    i = random.randint(p, r)    temp = array[i]    array[i] = array[r]    array[r] = temp    return partition(array, p, r)def randomized_quick_sort(array, p, r):    if p < r:        q = randomized_partition(array, p, r)        randomized_quick_sort(array, p, q-1)        randomized_quick_sort(array, q+1, r)
实验如下:
#codearr = [12, 8, 7, 1, 3, 5, 6, 4]print 'Before quick_sort:', arrrandomized_quick_sort(arr, 0, len(arr)-1)print 'After  quick_sort:', arr#resultD:\ProgramData\Anaconda2\python.exe G:/GUI/QuickSort.pyBefore quick_sort: [12, 8, 7, 1, 3, 5, 6, 4]After  quick_sort: [1, 3, 4, 5, 6, 7, 8, 12]
原创粉丝点击