📜  用于二进制插入排序的Python程序

📅  最后修改于: 2021-05-06 18:05:13             🧑  作者: Mango

我们可以使用二进制搜索来减少普通插入排序中的比较次数。二进制插入排序查找使用二进制搜索来找到适当的位置,以便在每次迭代时插入所选项目。
在普通插入中,排序在最坏的情况下需要O(i)(在第i次迭代中)。我们可以使用二进制搜索将其简化为O(logi)。

Python
# Python Program implementation  
# of binary insertion sort
  
def binary_search(arr, val, start, end):
    # we need to distinugish whether we should insert
    # before or after the left boundary.
    # imagine [0] is the last step of the binary search
    # and we need to decide where to insert -1
    if start == end:
        if arr[start] > val:
            return start
        else:
            return start+1
  
    # this occurs if we are moving beyond left\'s boundary
    # meaning the left boundary is the least position to
    # find a number greater than val
    if start > end:
        return start
  
    mid = (start+end)/2
    if arr[mid] < val:
        return binary_search(arr, val, mid+1, end)
    elif arr[mid] > val:
        return binary_search(arr, val, start, mid-1)
    else:
        return mid
  
def insertion_sort(arr):
    for i in xrange(1, len(arr)):
        val = arr[i]
        j = binary_search(arr, val, 0, i-1)
        arr = arr[:j] + [val] + arr[j:i] + arr[i+1:]
    return arr
  
print("Sorted array:")
print insertion_sort([37, 23, 0, 17, 12, 72, 31,
                        46, 100, 88, 54])
  
# Code contributed by Mohit Gupta_OMG 
Please refer complete article on Binary Insertion Sort for more details!