• python 插入排序


    核心思想

    将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数。即:序列的第一个元素,肯定是有序的,把第二个元素和第一个元素相比,插入到合适的位置,这样前两个元素就有序了,接着,把第三个元素插入到前面包含两个元素的有序列表中,以此类推,直至插完第n个数据。

    案例 把6插入到列表[3,5,8,10]

    正向思维

    ‘’’
    6和10比,6<10,6和10交换位置,10的索引+1,结果3,5,8,6,10
    6和8比,6<8,6和8交换位置,8,10的索引+1,结果3,5,6,8,10
    6和5比,6>5,结束
    ‘’’

    # @Time    :  '2020-12-9 0:52'
    # @Author  :  'pc.kang'
    
    a = [3, 5, 8, 10, 6]
    
    
    def insert_sort(lst):
    	idx = len(lst)
    	for i in range(1, idx):
    		if lst[idx-i] < lst[idx-i-1]:
    			lst[idx-i], lst[idx-i-1] = lst[idx-i-1], lst[idx-i]
    			print(lst)
    	return lst
    
    print(insert_sort(a))
    
    

    逆向思维

    ‘’’
    idx=4
    i=4,a[4]和a[3]交换,得到3,5,8,6,10
    i=3,a[3]和a[2]交换,得到3,5,6,8,10
    i=2,a[2]>a[1],break
    ‘’’

    # @Time    :  '2020-12-9 0:52'
    # @Author  :  'pc.kang'
    
    
    def insert_sort(lst):
    	idx = len(lst)-1
    	for i in range(idx, -1, -1):
    		print("----第%s次----"%(idx-i+1))
    		if lst[i] < lst[i-1]:
    			lst[i], lst[i-1] = lst[i-1], lst[i]
    			print(lst)
    		else:
    			break
    	return lst
    
    print(insert_sort(a))
    

    算法复杂度

    在最好的情况下,即序列已经是排好序的情况下,每次比较一次就退出while循环,则总比较次数是n-1次,时间复杂度是O(n)
    在最坏的情况下,即每次循环都要比较到第一个元素,则:
    第一次循环,比较了1次;
    第二次循环,比较了2次;

    第n-1次循环,比较了n-1次;
    总的比较次数是1+2+3+…+(n-1) = n(n-1)/2。
    我们上面所求得的n(n-1)/2,其时间复杂度,最大的影响因子是n2/2,故其时间复杂度是O(n2)。

  • 相关阅读:
    eclipse改变默认的编码格式(UTF-8)
    Guava学习:Joiner和Splitter工具(二)
    Guava中的Joiner和Splitter工具演示
    GitHub查找开源项目技巧分享
    java1.8特性之多重排序简单示例
    jedis工具类:java操作redis数据库
    SQL优化建议(mysql)
    Moodle插件之Filters(过滤器)
    Moodle插件开发系列——XMLDB编辑器
    Moodle插件开发——Blocks(版块)
  • 原文地址:https://www.cnblogs.com/kknote/p/16103429.html
Copyright © 2020-2023  润新知