蓝桥杯丨高级排序

简介: 蓝桥杯丨高级排序

前言

本文主要介绍三种较为高级的排序算法:快速排序、希尔排序以及归并排序

一、快速排序

快速排序是冒泡排序的高级版,其基本思想是每次在未排序的序列中取一个数作为基准值,把所有小于基准值的数都放在它(基准值)的左侧,把所有大于基准值的数都放在它的右侧,再递归对基准值的左右序列进行快速排序即可。

注:不稳定、O(nlogn)

快速排序的过程:

快速排序的算法:

#快速排序
num=list(map(int,input().split(' ')))        (1)
def QSort(left,right):                       (2)
    if(left>=right):                         (3)
        return                     
    l,r,key=left,right,num[left]             (4)
    while l<r:
        while l<r and num[r]>=key:           (5)
            r-=1
        num[l]=num[r]
        while l<r and num[l]<key:            (6)
            l+=1
        num[r]=num[l]
    num[l]=key                               (7)
    QSort(left,l-1)                          (8)
    QSort(l+1,right)                         (9)
QSort(0,len(num)-1)
print(num)

算法分析如下:


(1)输入一行整数,放入列表中,作为待排序序列


(2)快速排序算法主要是左右指针在活动,我们需要设置左右指针作为参数


(3)当左指针与右指针相遇时,该位置即为基准值的最终位置(设置递归终止条件)


(4)设置左右指针,以及基准值


(5)从右往左,找比基准值小的数,放在基准值的位置(此时该位置空出)


(6)从左往右,找比基准值大的数,放在空位(此时该比基准值大的数的位置空出)


(7)当左右指针相遇,此时空出的位置即为基准值的最终位置


(8)递归对基准值左边序列进行快速排序


(9)递归对基准值右边序列进行快速排序


二、希尔排序

希尔排序是对插入排序进行优化后产生的一种排序算法,它的基本思想是:把数组内的元素按下标增量分组,对每一组元素进行插入排序后,缩小增量并重复之前的步骤。

注:不稳定、O(n*n)

希尔排序的过程:

希尔排序的算法:

#希尔排序
lst=list(map(int,input().split(' ')))                           (1)
def ShellSort(num):                                             (2)
    step=len(num)//2                                            (3)
    while step>0:                                               (4)
        for i in range(step,len(num)):                          (5)
            ind=i                                           
            while ind >=step and num[ind]<num[ind-step]:        (6)
                num[ind],num[ind-step]=num[ind-step],num[ind]
                ind-=step
        step//=2                                                (7)
    return num
print(ShellSort(lst))

算法分析如下:


(1)输入一行整数,放入一个列表中,作为待排序序列


(2)希尔排序函数


(3)初始增量为列表长度的一半


(4)当增量大于0时循环


(5)遍历列表,实行插入排序


(6)当ind-step>0并且num[ind-step]大于了num[ind]时,交换两者位置


(7)缩小增量,继续循环

三、归并排序

归并排序算法的思想是:把数列拆分为子数列,对子数列进行排序后,再把有序的子数列合并为完整的有序数列。

注:稳定、O(nlogn)

归并排序的过程:

归并排序的算法:

#归并排序
lst=list(map(int,input().split(' ')))                        (1)
def MergeSort(num):                                
    if(len(num)<=1):                                         (2)
        return num              
    mid=int(len(num)/2)                                      (3)
    llist,rlist=MergeSort(num[:mid]),MergeSort(num[mid:])    (4)
    result=[]                                                (5)
    i,j=0,0
    while i<len(llist) and j<len(rlist):                     (6)
        if rlist[j]<llist[i]:
            result.append(rlist[j])
            j+=1
        else:
            result.append(llist[i])
            i+=1
    result+=llist[i:]+rlist[j:]                              (7)
    return result
print(MergeSort(lst))

算法分析如下:


(1)输入一行整数,放入一个列表,作为待排序序列


(2)当序列只剩一个元素时,返回(递归结束条件)


(3)每次将列表分为两部分,再分别对两部分进行排序


(4)分别对左右部分进行归并排序


(5)结果列表


(6)将排序结果放入结果列表中


(7)将剩余元素放入结果列表中  


总结

本文主要介绍三种高级排序方法:快速排序、希尔排序以及归并排序,其中归并排序是稳定的排序方法,快速排序以及希尔排序都是不稳定的排序算法。

目录
相关文章
|
算法 搜索推荐
蓝桥杯丨简单排序
蓝桥杯丨简单排序
76 0
|
17天前
|
算法
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
|
17天前
|
人工智能 算法
蓝桥杯真题宝藏排序详解 | 冒泡排序 选择排序 插入排序
蓝桥杯真题宝藏排序详解 | 冒泡排序 选择排序 插入排序
|
4月前
|
人工智能 算法 搜索推荐
蓝桥杯宝藏排序题目算法(冒泡、选择、插入)
以下是内容的摘要: 本文介绍了三种排序算法:冒泡排序、选择排序和插入排序。冒泡排序通过不断交换相邻的逆序元素逐步排序,最坏情况下需要 O(n^2) 次比较。选择排序在每轮中找到剩余部分的最小元素并放到已排序序列的末尾,同样具有 O(n^2) 时间复杂度。插入排序则是将每个元素插入到已排序序列的正确位置,时间复杂度也是 O(n^2),但空间复杂度为 O(1)。
|
5月前
蓝桥杯真题代码记录(数位排序
蓝桥杯真题代码记录(数位排序
36 0
|
5月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-493 合并排序数组
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-493 合并排序数组
44 0
|
5月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-97 排序
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-97 排序
26 0
|
5月前
|
算法 Java
②【Java 组】蓝桥杯省赛真题解析 [振兴中华] [三部排序] 持续更新中...
②【Java 组】蓝桥杯省赛真题解析 [振兴中华] [三部排序] 持续更新中...
46 0
|
5月前
|
存储
蓝桥杯-1/14天-数位排序【继承Comparable接口实现排序】
蓝桥杯-1/14天-数位排序【继承Comparable接口实现排序】
|
搜索推荐
蓝桥杯历年真题题解----2020年-- 排序
蓝桥杯历年真题题解----2020年-- 排序