账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    做时间复杂度试验,插入排序首次运行与第二次运行结果不一,且慢于选择排序?
    41
    0

    以下是测试代码,插入排序前后结果分别为14.3S、8.7s

    选择排序前后结果均为6S左右

    import functools, random, time
    
    list = [random.random() for i in range(1,10000)]
    
    def timer(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            t0 = time.time()
            result = func(*args, **kw)
            t1 = time.time()
            print('Total running time %s : %s'
                %(func.__name__, str(t1 - t0))
                )
            return func(*args, **kw)
        return wrapper
    
    @timer
    def insert_sort(L):
        for i in range(1, len(L)):
            key = L[i]
            j = i - 1
            while j >= 0:
                if L[j] > key:
                    L[j + 1],L[j] = L[j],key
                j -= 1
        return L
    
    @timer    
    def select_sort(lists):
        count = len(lists)
        for i in range(0, count):
            min = i
            for j in range(i + 1, count):
                if lists[min] > lists[j]:
                    min = j
            lists[min], lists[i] = lists[i], lists[min]
        return lists
    
    @timer
    def my_sort(lists):
        return sorted(lists)
    
    my_sort(list)
    insert_sort(list)
    select_sort(list)
    insert_sort(list)
    select_sort(list)
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 想起曾經的思念 普通会员 1楼

      插入排序和选择排序的时间复杂度都是O(n^2),但是插入排序在实际应用中可能更快一些。这是因为插入排序只需要遍历一次数组,而选择排序需要遍历两次数组。

      假设我们有两个数组,一个是升序排列的,另一个是降序排列的。那么我们可以通过比较两个数组的元素来找到排序的位置。如果升序排列的数组中的第一个元素大于降序排列的数组中的最后一个元素,那么我们就选择升序排列的数组中的第一个元素作为基准,然后将所有小于基准的元素放在基准的左边,所有大于基准的元素放在基准的右边。重复这个过程,直到所有的元素都被正确地排序。

      然而,如果我们两次插入排序的时间复杂度都达到O(n^2),那么我们就需要寻找一种更好的排序算法。在实际应用中,快速排序和归并排序等算法通常比插入排序更快。然而,这些算法的实现通常比较复杂,需要一些编程知识。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部