您的位置:首页 > 其它

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

2017-06-21 11:09 274 查看

快速排序的描述

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

分解:数组array[p, r]分解为两个子数组array[p, q-1]和array[q+1, r],使得array[q]分别大于等于和小于等于两个数组里面的值。

解决:调用快速排序,对上面的两个子数组进行排序

合并:因为子数组都是原址排序,所以不需要合并操作。

下面的程序实现快速排序(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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息