经典算法---插入排序 insert-sort

时间复杂度: O ( n 2 ) O(n^2) O(n2)

在算法导论中“算法分析”一节就是以“插入排序”为例分析的,已经分析的很清楚了,最好情况下,即已经排好序的情况下,只有外层循环,所以时间复杂度为 O ( n ) O(n) O(n),但是如果正好是逆序,那么时间复杂度为 O ( n 2 ) O(n^2) O(n2)

思想:

取待排序的牌,和已排序的手牌(从左到右依次变大)里最右边的牌开始比较大小,如果最右边的牌比待排序的牌大,那么已排序的牌往后移,直到找到比它小的牌,在其右侧插入。

  1. C语言实现

    int insert_sort(int a[], int len)
    {
        int i, j, key;
        for(j = 1; j < len; j++)//下标为0的第一个对象相当于已排序。所以从第二个往后开始进行插入排序。
        {
            key = a[j];
            i = j-1;
            while(i >= 0 && a[i] > key)    
            {
                a[i+1] = a[i];
                i--;
            }
            a[i+1] = key;
        }
        return 0;
    }
    
  2. Python实现

    import random
    
    #生成指定长度、指定类型的list
    def arr_init(len=10):
        lst = [random.randrange(100) for i in range(len)]
        return  lst
    
    def insert_sort(alist):
        list1 = alist
    
        for index, value in enumerate(list1):
            if index==0:
                continue
    
            key = value
            i = index-1
            while(i>=0 and list1[i]>key):
                list1[i+1]=list1[i]
                i-=1
            list1[i+1]=key
    
    #插入排序
    def insert_sort_test():
        list1 = arr_init(10)
        print("排序前:", list1)
    
        insert_sort(list1)
        print("排序后:", list1)
    
    if __name__ == '__main__':
        #1、插入排序
        insert_sort_test()
    

    输出

    排序前: [6, 6, 75, 33, 74, 28, 17, 55, 43, 63]
    排序后: [6, 6, 17, 28, 33, 43, 55, 63, 74, 75]
    

你可能感兴趣的:(算法)