排序算法的python实现及算法分析——归并排序(merge sort)和快速排序(quick sort)

5 归并排序

归并排序的思路是将数据表持续分裂成为两半,分别对两半进行归并排序,然后在合并,其过程为递归算法。每个步骤为:

排序算法的python实现及算法分析——归并排序(merge sort)和快速排序(quick sort)_第1张图片
归并排序实例
排序算法的python实现及算法分析——归并排序(merge sort)和快速排序(quick sort)_第2张图片
python实现源码

## 归并算法
def merge_sort (lst):
    if len(lst)<=1:   #递归结束条件
        return lst
    #分解问题,并递归调用
    middle=len(lst)//2
    left=merge_sort(lst[:middle])
    right=merge_sort(lst[middle:])
    #合并左右部分,完成排序
    merged=[]
    while left and right:
        if left[0]<=right[0]:
            merged.append(left.pop(0))
        else:
            merged.append(right.pop(0))
    merged.extend(right if right else left)
    return merged
alist5=[0,1,17,7,9,3,18,25,8]
merge_sort(alist5)
print(alist5) 

算法分析
归并排序分为两个过程:分裂和归并

  1. 分裂过程与二分查找结果类似,时间复杂度为O(log n);
  2. 归并过程为对分裂的各部分,其所有数据项均会被比较和放置一次,是线性复杂度,其时间复杂度为O(n),;
  3. 每次分裂都会进行一次归并,因此,总的时间复杂度是O(n log n)
    注意: 归并排序使用了额外1倍的存储空间用于归并,在处理大数据集需要额外考虑空间复杂度。

6 快速排序

求解思路:依据一个“中值”数据项来把列表分为两半:小于中值和大于中值的一半(不一定均分),然后对每部分分别进行快速排序(递归)
注:若想均分数据,则该“中值”为列表的“中位数”!此时有计算开销,
最简便的中值为随意一个数,如第1个数。
递归调用过程与上面的归并排序一致,
排序过程:排序算法的python实现及算法分析——归并排序(merge sort)和快速排序(quick sort)_第3张图片
排序算法的python实现及算法分析——归并排序(merge sort)和快速排序(quick sort)_第4张图片
python实现:

def quicksort(a, left, right):
    # 确定基条件
    if left>right:
        return
    # 申明需要用到的变量
    temp = a[left]
    i = left
    j = right
    # 交换中间变量
    t = temp

    # 缩小问题规模
    # 在左右指针相遇之前完成所有交换,用基准将数组分为两组
    while i != j:
        # 先从右往左扫描,遇到比基准小的便停下来
        while a[j]>=temp and i<j:
            j -= 1
        # 在从左往右扫描,遇到比基准大的数便停下来
        while a[i]<=temp and i<j:
            i += 1
        # 左右交换
        t = a[j]
        a[j] = a[i]
        a[i] = t
    # 左右指针相遇,将基准放到数组中间将数组划分为两块
    a[left] = a[i]
    a[i] = temp
    # print(a)
    # 调用递归
    quicksort(a, left, i-1)
    quicksort(a, i+1, right)

# 测试实例
if __name__ == "__main__":
    a = [6,8,2,3,4,5,7]
    quicksort(a,0,len(a)-1)
    print(a)  # [2, 3, 4, 5, 6, 7, 8]

算法分析
快速排序过程分为两部分:分裂和移动:若分裂将数据表分为相等的两部分,那么久有O(log n)的复杂度,而移动需要每数据与中值对比,还是O(n),综合起来算法复杂度就是O(n log n)。
:快速排序过程中不需要额外的存储空间。但是中值不能太偏离中心,极端情况下算法复杂度为O(n^2)。需要探讨选取中值的方法,如:三点取样,

欢迎留言与评论,交流如何改进快速排序算法

你可能感兴趣的:(数据结构与算法-python版,快速排序,排序算法,算法,数据结构)