[算法] 求无序数组元素最小差值

通过排序后,依次遍历前后两值求差即可,所以实质上的核心问题是排序;

通过经典的比较排序算法复杂度在O(nlogn),而如果数据波动不大,则可通过桶排序将复杂度降到O(n);

 

array = (5, 2, 4, 9, 0, 6)

# quick sort
# O(nlogn)
def split(list, start, end):
    middle = list[end]
    index = start -1
    for i in range(start, end+1):
        if list[i] <= middle:
            index += 1
            temp = list[i]
            list[i] = list[index]
            list[index] = temp

    return index

def quick_sort(list, start, end):
    if (start < end):
        index = split(list, start, end)
        quick_sort(list, start, index-1)
        quick_sort(list, index+1, end)

# bucket sort
def bucket_sort(list):
    max_e = list[0]
    min_e = list[0]

    # max & min element
    for i in list:
        if i > max_e:
            max_e = i
        if i < min_e:
            min_e = i

    bucket_v = max_e - min_e + 1
    B = []
    for i in range(bucket_v):
        B.append(0)
    for i in list:
        B[i - min_e] += 1
    return B

def min_diff():
    l = list(array)

    # sort
    B = bucket_sort(l)
    first = True
    diff = -1
    for i in range(len(B)):
        if B[i] >= 2:
            diff = 0
            break
        elif B[i] == 1 and first:
            low = i
            first = False
        elif B[i] == 1: # ! first
            high = i
            tmp_diff = high - low
            if (diff < 0 or tmp_diff < diff):
                diff = tmp_diff
            low = i
        # else B[i] == 0, ignore

    print "min diff from bucket sort:", diff

    # qsort
    quick_sort(l, 0, len(l)-1)
    first = True
    diff = -1
    for i in l:
        if first:
            low = i
            first = False
        else:
            high = i
            tmp_diff = high - low
            if (diff < 0 or tmp_diff < diff):
                diff = tmp_diff
            low = i

    print "min diff from quick sort:", diff

if __name__ == "__main__":
    print array
    min_diff()

 

转载于:https://www.cnblogs.com/ZisZ/p/3302688.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值