跟我一起学 - 算法导论 - 插入排序

简介:
算法导论 - 算法入门 ,一小节(插入排序,复杂度)
#   插入排序                -         复杂度
def  insertion_sort(arr):              #  1
     for  j  in  xrange(  1 ,len(arr) ):    #  n-1
        key  =  arr[j]                  #  n-1
        i = j - 1                          #  n-1
         while  i >= and  arr[i] >  key :  #  n(n-1)/2
            arr[i + 1 =  arr[i]         #  n(n-1)/2
            i = i - 1                      #  n(n-1)/2
        arr[i + 1 =  key                #  n-1
         print  arr                     #  n-1
验证结果 :
>>> arr=[5,2,4,6,1,3]
>>> insertion_sort(arr)
[2, 5, 4, 6, 1, 3]
[2, 4, 5, 6, 1, 3]
[2, 4, 5, 6, 1, 3]
[1, 2, 4, 5, 6, 3]
[1, 2, 3, 4, 5, 6]
验证复杂度:
z = 5(n-1)+1+3n(n-1)/2 
我们测试数据 为  n=6  
当数据极端情况就是需要全部重新排列 
就是 [6,5,4,3,2,1] 要排出 [1,2,3,4,5,6] 这样
>> z = 71 
一种比较笨的 验证方法 供大家拍砖 :
def  insertion_sort(arr):         
    ii
= 0
    ii
+= 1
    
for  j  in  xrange(  1 ,len(arr) ):
        ii
+= 1
        
        key 
=  arr[j]            
        ii
+= 1
        
        i
= j - 1                 
        ii
+= 1
        
        
while  i >= and  arr[i] >  key :    
            ii
+= 1
            
            arr[i
+ 1 =  arr[i]    
            ii
+= 1
            
            i
= i - 1             
            ii
+= 1
            
        arr[i
+ 1 =  key            
        ii
+= 1
        
        
print  arr            
        ii
+= 1

    
print   " ---- " ,str(ii)
>>> arr=[6,5,4,3,2,1]
>>> insertion_sort(arr)
[5, 6, 4, 3, 2, 1]
[4, 5, 6, 3, 2, 1]
[3, 4, 5, 6, 2, 1]
[2, 3, 4, 5, 6, 1]
[1, 2, 3, 4, 5, 6]
---- 71  #复杂度验证为 71 
罗嗦下 n(n-1)/2
极端情况下  
i=1 ; j 需要挪动 1次
i=2 ; j 挪动 1+2次
i=3 ; j 挪动 1+2+3次
....
i=n ; j 挪动 1+2....+n
我们又找到 (1+n)+(2+n-1)+(3+n-2).... = (1+n)n/2
我们这 的 i 是从 2 次开始的 也就是说  (n-1)n/2 了 
def  tn(ii):
    ti
= 0
    
for  i  in  xrange(ii) :
        
for  j  in  xrange(i) :
            ti
+= 1
    
print  ti


print  tn( 2 )   # 1 = 1
print  tn( 3 )   # 3 = 1+2
print  tn( 4 )   # 6 = 1+2+3
..



本文转自博客园刘凯毅的博客,原文链接:跟我一起学 - 算法导论 - 插入排序,如需转载请自行联系原博主。



目录
相关文章
|
5月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
40 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
5月前
|
搜索推荐 算法
【排序算法(一)】——插入排序,选择排序 —> 深层解析
【排序算法(一)】——插入排序,选择排序 —> 深层解析
|
8月前
|
算法 搜索推荐 C#
|
9月前
|
机器学习/深度学习 算法 搜索推荐
数据结构算法--2 冒泡排序,选择排序,插入排序
**基础排序算法包括冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素比较交换,逐步将最大值“冒”到末尾,平均时间复杂度为O(n^2)。选择排序每次找到剩余部分的最小值与未排序部分的第一个元素交换,同样具有O(n^2)的时间复杂度。插入排序则类似玩牌,将新元素插入到已排序部分的正确位置,也是O(n^2)复杂度。这些算法适用于小规模或部分有序的数据。**
|
9月前
|
算法 搜索推荐
数据结构与算法-插入排序
数据结构与算法-插入排序
43 2
|
9月前
|
算法 搜索推荐 数据可视化
【漫画算法】插入排序:插入宝石的传说
【漫画算法】插入排序:插入宝石的传说
|
9月前
|
人工智能 搜索推荐 JavaScript
心得经验总结:排序算法:插入排序法(直接插入法和希尔排序法)
心得经验总结:排序算法:插入排序法(直接插入法和希尔排序法)
64 0
|
9月前
|
机器学习/深度学习 搜索推荐 算法
【C/排序算法】:直接插入排序和希尔排序
【C/排序算法】:直接插入排序和希尔排序
64 0
|
9月前
|
搜索推荐 算法
排序算法之插入排序
排序算法之插入排序
70 0
|
9月前
|
搜索推荐
排序算法---插入排序-----详解&&代码
排序算法---插入排序-----详解&&代码