常见十大排序算法,动图演示(Python3实现)

小编在学习了数据结构、算法分析设计、Java、Python等之后,回顾所学发现见到最多的还是各种排序算法,站在前辈的肩膀上,决定做个总结。

一、概述:

常见的排序算法基本可以分为十种(见下图),除此之外,还有结合多种算法思想基于他们的改进变种。

1. 插入排序、选择排序、交换排序:这三大类基于比较的排序算法,时间复杂度会随着优化程度在O(n^2)~O(nlogn)之间变化;

2. 希尔排序、快速排序、堆排序:它们分别代表着杰出的优化策略;

3. 归并排序:基于分治递归思想,将待排数据像二叉树一样分化至最简单的一个数排序问题,子问题合并时间复杂度可控制在O(n),不难想到整体时间复杂度取决于树的深度,即达到O(nlogn);

4. 计数排序、桶排序、基数排序:这三种线性时间排序算法本质上运用了相同的思想,先将数据按一定映射关系分组(桶),然后桶内排序,顺序输出。三种姑且称为‘桶’排序算法在分组函数使用上不同,导致分组粒度不同,带来的额外空间开销出现差异。这三种排序算法适用于数据满足一定的条件,否则额外的空间开销将无法承受。

二、算法简介及代码展示

 

1.简单插入排序

简单插入排序操作n-1轮,每轮将一个未排序树插入排好序列。

开始时默认第一个数有序,将剩余n-1个数逐个插入。插入操作具体包括:比较确定插入位置,数据移位腾出合适空位

代码如下:

def InsertSort(ls):
    n=len(ls)
    if n<=1:
        return ls
    for i in range(1,n):
        j=i
        target=ls[i]                    #每次循环的一个待插入的数
        while j>0 and target<ls[j-1]:   #比较、后移,给target腾位置
            ls[j]=ls[j-1]
            j=j-1
        ls[j]=target                    #把target插到空位
    return ls

2.希尔排序

希尔排序是插入排序的高效实现,对简单插入排序减少移动次数优化而来。

简单插入排序每次插入都要移动大量数据,前后插入时的许多移动都是重复操作,若一步到位移动效率会高很多。

若序列基本有序,简单插入排序不必做很多移动操作,效率很高。

希尔排序将序列按固定间隔划分为多个子序列,在子序列中简单插入排序,先做远距离移动使序列基本有序;逐渐缩小间隔重复操作,最后间隔为1时即简单插入排序。

代码如下:

def ShellSort(ls):
    def shellinsert(arr,d):
        n=len(arr)
        for i in range(d,n):
            j=i-d
            temp=arr[i]                     #记录要出入的数
            while(j>=0 and arr[j]>temp):    #从后向前,找打比其小的数的位置
                arr[j+d]=arr[j]             #向后挪动
                j-=d
            if j!=i-d:
                arr[j+d]=temp
    n=len(ls)
    if n
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java Punk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值