Python 舍伍德算法
介绍
Sherwood 算法总能找到正确解并且与确定性算法一样可靠。
当确定性算法在平均情形下的表现比最坏情形快很多的时候,Sherwood 算法可用来加速最坏情形的运行过程,从而提高整个算法的运行效率。
目标
排序问题:
输入:
给定 n 个元素序列[a0, a1, a2, …, an-1]
输出:
重新排过序的序列[a0’, a1’, a2’, …, an-1’]
代码1[随机快速排序]
import numpy as np
def get_random(i, j=None):
if j == None:
# 返回0-i的随机整数
return np.random.randint(i+1)
if i > j:
i, j = j, i
# 获取i-j的随机整数
return np.random.randint(i, j + 1)
def quick_sort(mess_array, left, right):
if left < right:
# 随机下标
random_flag = get_random(left, right)
# 随机交换
mess_array[left], mess_array[random_flag] = mess_array[random_flag], mess_array[left]
value = mess_array[left]
i, j = left, right
while i < j:
# 从右到左的第一个小于value的下标
while i < j and value < mess_array[j]:
j -= 1
if i < j:
mess_array[i] = mess_array[j]
i += 1
# 从左到右的第一个大于等于value的下标
while i < j and value >= mess_array[i]:
i += 1
if i < j:
mess_array[j] = mess_array[i]
j -= 1
mess_array[i] = value
quick_sort(mess_array, left, i-1)
quick_sort(mess_array, i+1, right)
if __name__ == '__main__':
np.random.seed(7)
array_min = 0
array_max = 100
array_size = 30
random_array = np.random.randint(array_min, array_max, array_size)
# random_array = np.array([i for i in range(array_size)])
print('origin array:')
print(random_array)
print('sort array:')
print(np.sort(random_array))
quick_sort(random_array, left=0, right=array_size-1)
print('sherwood sort array:')
print(random_array)
代码2[洗牌优化]
import numpy as np
def quick_sort(mess_array, left, right):
if left < right:
# 洗牌
temp_mess_array = mess_array[left : right+1]
np.random.shuffle(temp_mess_array)
mess_array[left: right+1] = temp_mess_array
value = mess_array[left]
i, j = left, right
while i < j:
# 从右到左的第一个小于value的下标
while i < j and value < mess_array[j]:
j -= 1
if i < j:
mess_array[i] = mess_array[j]
i += 1
# 从左到右的第一个大于等于value的下标
while i < j and value >= mess_array[i]:
i += 1
if i < j:
mess_array[j] = mess_array[i]
j -= 1
mess_array[i] = value
quick_sort(mess_array, left, i-1)
quick_sort(mess_array, i+1, right)
if __name__ == '__main__':
np.random.seed(7)
array_min = 0
array_max = 100
array_size = 30
random_array = np.random.randint(array_min, array_max, array_size)
print('origin array:')
print(random_array)
print('sort array:')
print(np.sort(random_array))
quick_sort(random_array, left=0, right=array_size-1)
print('sherwood sort array:')
print(random_array)