...

『Insertion Sort』详解「插入排序」的Python实现

插入排序

网上一查定义全都有。这里不做赘述。
我觉得最好的对插入排序的比喻就是斗地主的摸牌,摸一张看看顺序插入一下。
数组分两个部分,有序区,无序区。
你手牌就是有序区。 堆着的那些牌就是无序区

先看下经典的代码实现再来讲解注意点。
参考链接 Python Program for Insertion Sort

Python代码实现

"""  
方法1:利用while进行判断然后从后向前  
方法2:利用for进行判断从后向前  
"""  
def insertionSort(arr):    
    for i in range(1, len(arr)):    
        j = i     
        while j > 0:    
            if arr[j] < arr[j-1]:    
                arr[j-1], arr[j] = arr[j], arr[j-1]    
                j-=1  
            else:  
                break  
            # 已经最大无需对比所以加入了break这样最优时间复杂度为n   
    return arr    

arr = [ 5, 6,18,4,9,-5,3,11]     
print(insertionSort(arr))    

# result    
# [-5, 3, 4, 5, 6, 9, 11, 18]    

def insertionSort(arr):  
    for i in range(1, len(arr)):  
        for j in range(i,0,-1):  
            if arr[j] < arr[j-1]:  
                arr[j], arr[j-1] = arr[j-1], arr[j]  
    return arr  
arr = [66,4,8,90,13,6,-9]  
print(insertionSort(arr))  

# result    
# [-5, 3, 4, 5, 6, 9, 11, 18]    

我来说一下几个点吧。
Q:为什么从1开始。
前面说了,玩扑克的时候你也是从摸第二张的时候才知道该插哪里吧。第1张不需要插入,属于默认的有序区。
拿着的第1张牌默认是排好的,所以从index为1开始,而不是0。
Q:i为什么赋值给了j
这代表有序区最大的index值
因为插入排序基本的观点就是从后向前扫。
Q:从后向前扫进行交换是什么意思?
从后: i赋值给了j这样就得到了后这个字的含义,得到最大的index才能向前啊!
从后向前:只要j还是大于0,那么就自减1。
交换不必说了。只要我比你小,那么我就接着向前走。

C语言辅助理解

接下来我贴一个C语言实现,其实我也不会C语言指针结构体太难的什么的。
只要上网花一天时间看一下基本的数据类型和语法结构,就这种程度就可以看懂。
如果你要去学习数据结构和算法,那么最好从C语言这种编译型的语言辅助你理解。

#include <math.h>   
#include <stdio.h>   

void insertionSort(int arr[], int n)   
{   
    int i, key, j;   
    for (i = 1; i < n; i++) {   
        key = arr[i];   
        j = i - 1;    
        while (j >= 0 && arr[j] > key) {   
            arr[j + 1] = arr[j];   
            j = j - 1;   
        }   
        arr[j + 1] = key;   
    }   
}   


void printArray(int arr[], int n)   
{   
    int i;   
    for (i = 0; i < n; i++)   
        printf("%d ", arr[i]);   
    printf("\n");   
}   

int main()   
{   
    int arr[] = { 12, 11, 13, 5, 6 };   
    int n = sizeof(arr) / sizeof(arr[0]);   

    insertionSort(arr, n);   
    printArray(arr, n);   

    return 0;   
}   

共有评论(0)

登陆即可评论哦