用分治法解决快速排序问题
基本思想:侧重分解,简化合并
- 分解:数组划分
选定一个元素作为数组的主元,作为数组的分界线
主元左边的数小于主元右边的数
主元为固定位置的元素
'''
1. 选取固定位置的元素作为主元,一般为首元素或者尾元素
2. 定义i和j两个元素分别作为划分的两个部分的右端元素
3. 比较主元和arr[j],
如果A[j]<=x:则交换A[j]和A[i+1],i和j同时右移
如果A[j]>x:则j右移
4. 把主元放在两部分中间做分界线
'''
def Partition(Arr, p, r):
"""
:param Arr: 数组
:param p: 起始位置
:param r: 终止位置
:return: 返回划分位置q即主元
"""
x = Arr[r]
i = p - 1
for j in range(p, r):
if Arr[j] <= x:
Arr[i + 1], Arr[j] = Arr[j], Arr[i + 1]
i += 1
Arr[i + 1], Arr[r] = Arr[r], Arr[i + 1]
q = i + 1
return q
def QuickSort(Arr, p, r):
if p < r:
q = Partition(Arr, p, r)
QuickSort(Arr, p, q-1)
QuickSort(Arr, q+1, r)
return Arr
- 随机主元
随机生成主元的两种方式:
1. s = random.choice(range(p, r+1))
2. s = random.randint(p,r)
import random
import numpy
def Partition(Arr, p, r):
x = Arr[r]
i = p - 1
for j in range(p, r):
if Arr[j] <= x:
Arr[i + 1], Arr[j] = Arr[j], Arr[i + 1]
i += 1
Arr[i + 1], Arr[r] = Arr[r], Arr[i + 1]
q = i + 1
return q
def Randomized_Partition(Arr, p, r):
s = random.randint(p, r)
Arr[s], Arr[r] = Arr[r], Arr[s]
q = Partition(Arr, p, r)
return q
def Randomized_QuickSort(Arr, p, r):
if p < r:
q = Randomized_Partition(Arr, p, r)
Randomized_QuickSort(Arr, p, q - 1)
Randomized_QuickSort(Arr, q + 1, r)
return Arr
if __name__ == "__main__":
Arr = [2,1,3,5,8,7,6,4]
Arr = numpy.array(Arr) # 也可不转换为数组
print(Randomized_QuickSort(Arr, 0, len(Arr)-1)