[Python3]Sherwood 型线性时间选择算法

# sherwood algorithm
import time
import random


def time_calculate():
    start = time.perf_counter()
    mid_value = main()
    end = time.perf_counter()
    return mid_value, end - start


def sherwood_solve(arr):
    length = len(arr)
    mid = (length - 1) // 2

    def swap(i, j):
        if i == j:
            return
        arr[i] ^= arr[j]
        arr[j] ^= arr[i]
        arr[i] ^= arr[j]

    def solve(li=0, ri=length-1):
        if li >= ri:
            # print("->", li, ri)
            if li == mid:
                return arr[ri]
            else:
                return None
        pivot = random.randint(li, ri)
        pivot_value = arr[pivot]
        swap(li, pivot)
        l = li
        r = ri
        while l < r:
            while arr[l] <= pivot_value and l < ri:
                l += 1
            while arr[r] >= pivot_value and r > li:
                r -= 1
            if l < r:
                swap(l, r)
        pivot = r
        swap(li, pivot)
        if pivot == mid:
            return pivot_value
        l_result = solve(li, pivot-1)
        if l_result is not None:
            return l_result
        return solve(pivot+1, ri)

    mid_v = solve()
    return mid_v


def main():
    arr = []
    length = random.randint(20, 28)
    # length = 1
    print("Array:")
    for i in range(length):
        arr.append(random.randint(0, 100))
        print(arr[i], end=" ")
    print("")
    return sherwood_solve(arr)


if __name__ == "__main__":
    mid_value, time_consumption = time_calculate()
    print("Mid value = {} Time consumption : {}".format(mid_value, time_consumption))

猜你喜欢

转载自blog.csdn.net/chenhanxuan1999/article/details/91850267