python-算法与数据结构-DAY_6

1.快速排序
快速排序要理解递归在中间的作用

基本原理
1.首先选出一个值作为中间值,将中间值放旁边,在头尾分别放置两个游标
2.头尾游标通过夹逼,得到中间值所在位置,以次为基准,一分为二,这时左侧为小于中间值的数组,右侧为大于中间值的数组
3.在左右数组分别重复上述步骤,直至排序完成

最优时间复杂度O(nlogn)
最坏时间复杂度O(n²)

def quick_sort(alist, first, end):
    if first >= end:
        return alist
    mid_value = alist[first]
    low = first
    high = end
    while low < high:
        while low < high and alist[high] >= mid_value:
            high -= 1
        alist[low] = alist[high] 
         # 判断不成立,那么high值就是小于中间数的值,故放在low内
        while low < high and alist[low] < mid_value:
            low += 1
        alist[high] = alist[low]  
        # 判断不成立,那么low值就是大于中间数的值,故放在high内
    alist[low] = mid_value
    quick_sort(alist, first, low - 1)  # 递归循环中间值左侧的数组
    quick_sort(alist, low + 1, end)  # 递归循环中间值右侧的数组
    return


if __name__ == '__main__':
    l = [1, 3, 5, 7, 2, 4, 6]
    quick_sort(l, 0, len(l) - 1)
    print(l)

[1, 2, 3, 4, 5, 6, 7]

2.归并排序
基本原理:
1.将数组对半拆分,将拆分后的数组继续对半拆分,直至每个数据自成一组
2.两两排序何为一组,重复上述步骤,直至合为一组,完成排序
最优与最坏的时间复杂度均为O(nlogn)

def merge_sort(alist):
    n = len(alist)
    if n <= 1:
        return
    mid = n // 2
    left = merge_sort(alist[:mid])#左右分成两组
    right = merge_sort(alist[mid:])
    left_point, right_point = 0, 0
    result = []
    while left_point < len(left) and right_point < len(right):
        if left[left_point] < right[right_point]:
            result.append(left[left_point])
            left_point += 1
        else:
            result.append(right[right_point])
            right_point += 1
    result += left[left_point]
    result += right[right_point]
    return result

3.二分搜索
1.对于数组一分为二,通过特征确定是在哪一部分数据。
2.重复上述步骤,直至查找到
仅使用于有规律数据
最坏时间复杂度O(logn)

def binary_search(alist, item):
    n = len(alist)
    if n > 0:
        mid = n // 2
        if alist[mid] == item:
            return True
        elif item < alist[mid]:
            return binary_search(alist[:mid], item)
        elif item > alist[mid]:
            return binary_search(alist[mid:], item)
    return False


if __name__ == '__main__':
    l = [1, 2, 3, 4, 5, 6]
    print(binary_search(l, 2))

猜你喜欢

转载自blog.csdn.net/soulproficiency/article/details/104545031
今日推荐