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

快速排序的描述

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


  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:', arr
quick_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)
实验如下:
#code
arr = [12, 8, 7, 1, 3, 5, 6, 4]
print 'Before quick_sort:', arr
randomized_quick_sort(arr, 0, len(arr)-1)
print 'After  quick_sort:', arr

#result
D:\ProgramData\Anaconda2\python.exe G:/GUI/QuickSort.py
Before quick_sort: [12, 8, 7, 1, 3, 5, 6, 4]
After  quick_sort: [1, 3, 4, 5, 6, 7, 8, 12]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值