zoukankan      html  css  js  c++  java
  • 插入排序算法进阶

      将有监督的插入排序,优化为无监督的插入排序,寻找全局最小值并将其放到开头,所以j不可能=0,固可去掉监督项j>=0。由于原来的j>=0的判断的时间复杂度为n^2阶,经优化后时间复杂度为n阶,时间效率有所提高,这一点从程序的运行结果也可以看出。

    import time
    
    li1=[i for i in range(10)]
    li=li1[::-1]
    
    def insertsort1(li):
        n = len(li)
        for i in range(1,n):
            temp=li[i] #先将待排序的最靠前的一个元素进行保存
            j=i-1 #找到已经排好序的最后一个元素
            while temp<li[j] and j>=0:#开始对temp代表的元素进行插入排序
                li[j+1]=li[j]
                j-=1
            li[j+1]=temp
        return li
    
    def insertsort2(li):
        n = len(li)
        min=0
        #寻找全局最小值的下标
        for i in range(1,n):
            if li[i]< li[min]:
                min=i
        #全局最小值放在最前面
        while(min>0):
            li[min],li[min-1]=li[min-1],li[min]
            min-=1
        for i in range(2,n):
            temp=li[i] #先将待排序的最靠前的一个元素进行保存
            j=i-1 #找到已经排好序的最后一个元素
            while temp<li[j]:#开始对temp代表的元素进行插入排序;因为全局最小已经放在了开头,所以j不可能=0,固可去掉监督项j>=0。
                li[j+1]=li[j]
                j-=1
            li[j+1]=temp
        return li
    start=time.time()
    # print(insertsort1(li))
    # 8.921818971633911
    # 8.789137840270996
    # 8.749927520751953
    # 8.736004114151001
    # 8.89368200302124
    print(insertsort2(li))
    # 7.535344123840332
    # 7.505179166793823
    # 7.654731512069702
    # 7.606301307678223
    # 7.568647146224976
    end=time.time()
    print(end-start)
    
  • 相关阅读:
    yaf将错误输出打印在页面上
    yaf设置命名空间
    yaf学习资料
    在 Github 上找「好东西」的方法
    在linux命令行下执行php 程序
    linux shell脚本查找重复行/查找非重复行/去除重复行/重复行统计
    php数组函数分析--array_column
    php 去掉字符串的最后一个字符
    设置arc 的默认编辑器
    需要学习的技术
  • 原文地址:https://www.cnblogs.com/wisteria68/p/13665554.html
Copyright © 2011-2022 走看看