各种排序算法的分析与比较

内部排序算法

直接插入排序:每次取一个记录插入到已经排好序的有序表中,得到一个新的有序表。在插入过程中为了防止下标出界,需要在r[0]处加入一个监视哨。该算法的时间复杂度为O(n^{2}),双层嵌套循环;空间复杂度为O(1),因为只需要一个额外的空间存储监视哨。

def insertSort(L):
    L.insert(0,0)   #插入监视哨,c初值为0
    for i in range(2,len(L)):      #第一个元素为有序,所以直接从第二个元素开始比较
        if L[i]<L[i-1]:
            L[0]=L[i]
            L[i]=L[i-1]
            j=i-2
            while L[0]<L[j]:
                L[j+1]=L[j]
                j-=1
                if j<=0:
                    break
            L[j+1]=L[0]
    return L[1:]

实验结果:

为了方便以后可以更快的熟悉算法思想,添加一个实例:

图片来源:https://www.cnblogs.com/chengxiao/p/6103002.html

希尔排序:希尔排序是由直接插入排序发展而来,将待排序列分割成若干个子序列,并分别进行直接插入排序,(子序列是由相隔某个增量的记录组成的,而非分段),最后进行一次直接插入排序。注意:增量序列的值应该没有除1以外的公因子,且最后一个增量值必须为1.该算法的时间复杂度小于O(n^{2}),与选取的增量值相关。

def shellInsert(L,dk):    #一次排序
    for i in range(dk+1,len(L)):
        if L[i]<L[i-dk]:
            L[0]=L[i]
            j=i-dk
            while j>0 and L[0]<L[j]:
                L[j+dk]=L[j]
                j-=dk
            L[j+dk]=L[0]

def shellSort(L):     #希尔排序
    dk=[5,3,1]    #增量序列
    L.insert(0,0)
    for i in dk:
        shellInsert(L,i)
        print(L[1:])    #输出每次排序的结果
    return L[1:]

实验结果:

输出每次排序后的结果以及最终排序结果

实例:

图片来源:https://www.cnblogs.com/chengxiao/p/6104371.html

冒泡排序:每一轮排序都从第一位开始将相邻的两位进行比较,如果t-1位比t位的值大,则将其交换顺序。每轮排序后,都会将未排序序列的最大数移到最后一位。当开始时序列即为从小到大有序序列,只需要一次就可以完成排序,时间复杂度为O(n); 当序列为逆序排列时,所需排序次数为n-1次,每次比较的次数为n-i次,时间复杂度为O(n^{2});算法的平均时间复杂度为O(n^{2})

def bubbleSort(L):
    for i in range(len(L)-1):
        flag=0   #判断序列是否发生变化
        for j in range(len(L)-i-1):
            if L[j]>L[j+1]:
                L[j],L[j+1]=L[j+1],L[j]
                flag=1
        print(L)
        if flag==0:
            break

运行结果:

实例介绍:

快速排序:第一趟快排将列表分为两部分,一部分的关键字均比另一部分关键字小,然后再分别对两部分进行排序。算法首先选定一点作为枢纽,然后分别设置两个指针low和high,high从尾部开始,找到小于枢纽的点,将其与枢纽交换;然后low从头部开始找到大于枢纽的点将其与枢纽交换。依次排序后以枢纽为中心分为两部分,且左边均比枢纽小,右边均比枢纽大。快速排序的平均时间复杂度为所有内部排序中最优的,但是在序列有序的情况下,其性能不能达到O(n)。空间复杂度为O(logn),因为每次快排包括递归过程中的枢纽值,都需要存储在一个栈中。(疑问:我觉得空间复杂度为O(1),因为在母串快排结束后,才开始子串的快排,且两个子串是顺序进行的,所以只需要一个空间存储枢纽值,就可以了。这样理解有什么问题呢?)

def Qsort(L,low,high):
    Low,High=low,high
    pivot=L[low]
    while (low<high):
        while L[high]>pivot and high>low:
            high-=1
        if high>low:
            L[low]=L[high]
            low+=1
        while L[low]<pivot and high>low:
            low+=1
        if high>low:
            L[high]=L[low]
            high-=1
    L[low]=pivot
    if Low<low-1:
        Qsort(L,Low,low-1)
    if High>low+1:
        Qsort(L,low+1,High)

def quickSort(L):
    Qsort(L,0,len(L)-1)
    print(L)

运行结果:

实例:

è¿éåå¾çæè¿°

图片来源:https://blog.csdn.net/qq_36528114/article/details/78667034

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值