蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序

简介: 蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序

上一篇文章我们讲到了解决宝藏排序的三种基本排序方法,这篇文章我们深入探讨一下两种进阶排序:快速排序和归并排序。让我们拿起键盘,一起敲起来吧!

宝藏排序题目:

快速排序详解:

解题思路:

找一个基准值x

把列表分成三部分:小于等于x的数字,x,大于x的数字

左半部分和右半部分递归使用该策略

例: a=【3,5,8,1,2,9,4,7,6】

找到基准值3,【1,2】3 【5,8,9,4,7,6】

左半部分【1,2】作为一个子问题求解

右半部分【5,8,9,4,7,6】作为一个子问题求解

代码演示:

# 列表a,左端点为left,右端点为right
# [left, right]
def partition(a, left, right):
    """找一个基准值,然后把数组分成三部分"""
    # 基准值为a[left]
    idx = left + 1
    for i in range(left + 1, right + 1):
        # 如果元素小于基准值,放到前面去
        if a[i] <= a[left]:
            a[i], a[idx] = a[idx], a[i]
            idx += 1
    # 把前半部分最后一个和基准值交换
    a[left], a[idx - 1] = a[idx - 1], a[left]
    return idx - 1
# 对a[left, right]进行排序
def quicksort(a, left, right):
    if left < right:
        mid = partition(a, left, right)
        # 此时a分为三部分,(left,mid-1),(mid),(mid+1,left)
        quicksort(a, left, mid - 1)  # 递归,自己调用自己排序
        quicksort(a, mid + 1, right)
quicksort(a, 0, n - 1)
print(' '.join(map(str, a)))

归并排序详解:

解题思路:

首先考虑一个问题:两个有序列表如何合并成一个列表:

A=【1,3,5,6,7】 、B=【2,3,4,9】

1、构建一个result=[]

2、当A非空且B非空:

     比较A[0]和 B[0]

     result添加较小的那个元素,并从原始数组弹出

3、如果A非空,把A添加到result末尾

4、如果B非空,把B添加到result末尾

然后考虑归并排序的算法步骤:

1、先把数组分成两部分

2、每部分递归处理变成有序

3、将两个有序列表合并起来

代码演示:

def Merge(A, B):
    # 合并两个有序列表,返回出合并的结果
    result = []
    while len(A) != 0 and len(B) != 0:
        if A[0] <= B[0]:
            result.append(A.pop(0))
        else:
            result.append(B.pop(0))
    result.extend(A)
    result.extend(B)
    return result    # result为已排序好的合并后的序列
def MergeSort(A):
    if len(A) <= 2:
相关文章
|
2月前
|
存储 搜索推荐 算法
【初阶数据结构篇】归并排序和计数排序(总结篇)
归并排序(MERGE-SORT)是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法(Divide andConquer)的⼀个⾮常典型的应⽤。
35 0
|
3月前
|
搜索推荐
【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】
【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】
【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】
|
3月前
|
搜索推荐
【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】
【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】
|
搜索推荐
[数据结构 -- 手撕排序算法第七篇] 递归实现归并排序
[数据结构 -- 手撕排序算法第七篇] 递归实现归并排序
|
5月前
|
算法 搜索推荐 C语言
C语言数据结构之排序整合与比较(冒泡,选择,插入,希尔,堆排序,快排及改良,归并排序,计数排序)
C语言数据结构之排序整合与比较(冒泡,选择,插入,希尔,堆排序,快排及改良,归并排序,计数排序)
|
存储 搜索推荐
[数据结构 -- 手撕排序算法第四篇] 堆排序,一篇带你搞懂堆排序
[数据结构 -- 手撕排序算法第四篇] 堆排序,一篇带你搞懂堆排序
|
12月前
【数据结构】论如何拿捏快速排序?(含非递归)
【数据结构】论如何拿捏快速排序?(含非递归)
43 0
|
存储 算法 搜索推荐
【数据结构】 七大排序详解(贰)——冒泡排序、快速排序、归并排序
【数据结构】 七大排序详解(贰)——冒泡排序、快速排序、归并排序
|
算法 搜索推荐 测试技术
【数据结构】 七大排序详解(壹)——直接插入排序、希尔排序、选择排序、堆排序
【数据结构】 七大排序详解(壹)——直接插入排序、希尔排序、选择排序、堆排序
|
搜索推荐
[数据结构 -- 手撕排序第一篇] 插入排序
[数据结构 -- 手撕排序第一篇] 插入排序