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