算法导论 2.3-6(更正)

题目

观察一下2.1节给出INSERTION-SORT过程,在第5~7行的while循环中,采用了一种线性查找策略,在已排序的子数组A[1...j-1]中(反向)扫描。是否可以用二分查找策略,来将插入排序的总体最坏情况运行时间改善至

分析

INSERTION_SORT(A)
1    for j <- 2 to length(A)
2        do key <- A[j]
3             #将A[j]插入到排列好的A[1…j-1]中
4             i <- j - 1
5             while i > 0 and A[i] > key
6                 do A[i+1] <- A[i]
7                      i <- i - 1
8              A[i+1] <- key
将while循环替换为二分查找后,伪代码如下所示:

伪代码

# BINARY-INSERTION-SORT(A)
# for j <- 2 to length(A)
#     do key <- A[j]
#        i = BINARY-SEARCH-INSERTION(A, 1, j-1, key)
#        while j > i
#            do A[j] <- A[j-1]
#               j <- j-1
#        A[i] <- key


# BINARY-SEARCH-INSERTION(A, p, r, v)
# if p <= r
#     then q <- 
#          if A[q] = v
#              then return q
#          else if A[q] > v
#                   then return BINARY-SEARCH-INSERTION(A, p, q-1, v)
#               else return BINARY-SEARCH-INSERTION(A, q+1, r, v)
# return p
在最坏情况下,while j > i的循环的时间复杂度为theta(n),所以整个for循环的时间复杂度为theta(n^2),因此不能将插入排序的总体最坏运行时间改善至

Pyhton实现

def binary_search_insertion(a, p, r, v):
    if p <= r:
        q = (p + r) / 2
        if a[q] == v:
            return q
        elif a[q] > v:
            return binary_search_insertion(a, p, q-1, v)
        else:
            return binary_search_insertion(a, q+1, r, v)
    return p

def binary_insertion_sort(a):
    for j in range(1, len(a)):
        key = a[j]
        i = binary_search_insertion(a, 0, j-1, key)
        while j > i:
            a[j] = a[j-1]
            j -= 1
        a[i] = key


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值