关于插入排序和谢尔排序的算法分析

举报
是Dream呀 发表于 2022/07/30 21:55:07 2022/07/30
【摘要】 关于插入排序和谢尔排序的算法分析

@[TOC](Shell Sort:)

谢尔排序基本知识:

我们注意到插入排序的对比次数,在最好的情况下是O(n),这种情况发生在列表已是有序的情况下,实际上,列表越接近有序,插入排序的对比次数就越少。
从这个情况入手,谢尔排序以插入排序为基础,对无序表进行“间隔”划分子列表,每个字列表都执行插入排序!

粗看上去,谢尔排序以插入排序为基础,可能并不会比插入排序好
但由于每趟都会使列表更加接近有序,这个过程会减少很多原先需要的“无效”比对。
其时间复杂度是:(n的2/3次方)

谢尔排序代码:

# -*-coding:utf-8 -*-
# @Author:到点了,心疼徐哥哥
# 奥利给干!!!
def shellSort(alist):
    subiscount=len(alist)//2
    while subiscount>0:
        for startposition in range(subiscount):
            gapcharu(alist,startposition,subiscount)
        print("After increments of size",subiscount,"The list is",alist)
        subiscount = subiscount//2
def gapcharu(alist,start,gap):
    for i in range(start+gap,len(alist),gap):
        xinxiang=alist[i]
        position=i
        while position >= gap and alist[position - gap] > xinxiang:
            alist[position] = alist[position - gap]
            position = position - gap
        alist[position] = xinxiang
alist=[11,25,5,9,4,55]
shellSort(alist)
print(alist)

@TOC

插入排序基本知识

插入排序时间复杂度是O(n的平方),但算法思路和冒泡排序选择排序不同;
插入排序维持一个已经排好序的子列表,其位置始终在列表前部,然后逐步扩大这个子列表直到全表。
第一趟,子列表中只有一个数据项,将第二个数据作为新项插入到子列表中,这样就具有了两个数据项。
第二趟,再继续将第三个数据项跟前两个数据项比对,并移动比自身大的数据项,空出位置来,以便加入到子列表中。
经过n-1趟的对比和插入,子列表扩展到全表,排序完成。

1.插入排序的对比主要用来寻找新项的插入位置
2.最差的情况是每趟都与子列表中的所有项进行比对,总对比次数与冒泡排序相同,数量仍是O(n的平方)
3.最好的情况是列表已经排好序时,每趟仅进行一次比对,总次数O(n)

插入排序代码

#-*-coding:utf-8 -*-
#@Author:到点了,心疼徐哥哥
#奥利给干!!!
def cahru(alist):
    for index in range(1,len(alist)):
        xinxiang=alist[index]
        position=index
        while position>0 and alist[position-1]>xinxiang:
            alist[position]=alist[position-1]
            position=position-1
        alist[position]=xinxiang
alist=[11,5,9,66,3,1]
cahru(alist)
print(alist)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。