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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章