【问题标题】:Binary Insertion Sort Implementation Python二进制插入排序实现 Python
【发布时间】:2020-10-12 11:15:59
【问题描述】:

在研究算法时,我发现了一种算法,它基本上是一种插入排序,但它使用二进制搜索而不是 WHILE 循环语句来向后移动元素。

我编写了以下实现代码,它适用于给定的输入。

我的问题是 1) 我的代码有什么改进吗? 2)尽管使用二进制搜索,我仍然无法理解为什么它有二次时间。我想我需要帮助来理解这一点。

提前感谢您的宝贵建议:)

A=[3,25,18,41,52,26,38,57,9,49]
def InsertionSort_improved(A):
    for k in range(1,len(A)):
        key = A[k]
        low = 0
        high = k-1
        BinarySearch(A,low,high,key,k)

def BinarySearch(A,low,high,key,k):
    if low<high:
        mid= (low+high)//2
        if A[mid] == key:
            for i in range(k,mid,-1):
                A[i] = A[i-1]
            A[i-1] = key
        elif A[mid] < key:
            BinarySearch(A, mid+1, high, key, k)
        else:
            BinarySearch(A, low, mid, key, k)
    else:
        mid=(low+high)//2
        if A[mid]>key:
            for j in range(k,mid,-1):
                A[j] = A[j-1]
            A[j-1] = key

InsertionSort_improved(A)
print(A)

【问题讨论】:

    标签: python sorting binary-search insertion-sort


    【解决方案1】:

    长话短说:因为这两行。

    for j in range(k,mid,-1):
        A[j] = A[j-1]
    

    元素的插入是这样的:

    • 找到插入新元素的位置;
    • 移动大量元素以为新元素腾出空间。

    你找到的代码使用二分查找来加速第一步,变成O(log(n))而不是O(n)

    但是它仍然需要移动元素,这是通过一个简单的 for 循环完成的,这需要 O(n) 时间。

    注意,当对链表而不是数组进行插入排序时,就不再需要移位了,所以第二步变成O(1)...但是用链表,二分查找是不可能的,所以第一步步骤仍然是O(n)

    结论:在数组和链表上,插入排序仍然是一种二次算法。

    【讨论】:

    • 感谢您的 cmets!它真的帮了我很多!现在我明白了——虽然我采用了二分搜索,但它仍然需要移动元素,这需要 O(n) 时间。
    猜你喜欢
    • 2013-06-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 2023-03-10
    • 2013-12-15
    相关资源
    最近更新 更多