简单插入排序&希尔排序(python)
 
        我不爱机器学习  
        
         
         
        
      
 
       
     
         专注机器学习、数据分析、编程语言,欢迎交流学习 
       
 
       
     Official Account 
   
 
  简单插入排序
基本思想:
-  
   当前元素与前一个元素比较,若前一个元素大于当前元素,则前一个元素后移,并用指针记录此时的位置; 
-  
   重复此过程,直到找到比其小的元素,则将元素赋给此时指针指向的位置;重复上面两个过程,直到当前元素为最后一个元素; 
-  
   注意,当前元素是从前往后开始取,但比较时,是从当前位置向前比较,并用指针记录位置,此时当前元素的前面元素均已排序。 
def insertSort(lst):
    n = len(lst)
    if n <= 1: return lst
    # 遍历所有的元素
    for i in range(1, n):
        cur = lst[i]  # 当前元素
        j = i - 1  # 位置记录指针
        # 当前元素小于前一个元素
        while j >= 0 and cur < lst[j]:
            lst[j + 1] = lst[j]  # 前一个元素往后移
            j -= 1
        # 此时的j指向前一个元素(前一个元素<=cur)
        lst[j + 1] = cur
    return lst
lst = input('输入数字:').split(' ')
lst = [eval(x) for x in lst]
insertSort(lst)
希尔排序
基本思想:
-  
   对不同间隔的元素进行比较,从后向前比较; 
-  
   间隔取值为 np.arange(n//2,0,-1),从大到小进行取值;
-  
   如[3,4,5,2,1],间隔为2时,5,3比较,2,4比较,1,5比较,1,3比较;间隔为1时,4,3比较,5,4比较,5,3比较......; 
-  
   是一个递归过程。 
def shellSort(lst):
    # start with a big gap,then reduce the gap
    n = len(lst)
    gap = n // 2
    print(lst)
    # Do a gapped insertion sort for this gap size.
    # The first gap elements lst[0..gap-1] are already in gapped
    # order keep adding one more element until the entire array
    # is gap sorted
    while gap > 0:
        for i in range(gap, n):
            # save lst[i] in cur and make a hole at position i
            cur = lst[i]  # 获取当前元素,因为是从后往前比较,因此从gap开始
            j = i  # 位置记录指针
            while j >= gap and lst[j - gap] > cur:
                lst[j] = lst[j - gap]
                j -= gap
            # put cur (the lst[i]) in its correct location
            lst[j] = cur
            print(lst)
        gap = gap // 2
    return lst
# -------------------------------------------------------------
# 递归写法
def shellSort(lst):
    def sort(lst, gap):
        for i in range(gap, n):
            cur = lst[i]  # 获取当前元素,因为是从后往前比较,因此从gap开始
            j = i  # 位置记录指针
            while j >= gap and lst[j - gap] > cur:
                lst[j] = lst[j - gap]
                j -= gap
            lst[j] = cur
    n = len(lst)
    gap = n // 2
    while gap > 0:
        sort(lst, gap)
        gap = gap // 2
    return lst
lst = input('输入数字:').split(' ')
lst = [eval(x) for x in lst]
shellSort(lst)
总结:都是从前往后遍历,再从后往前比较。
