算法导论插入排序

Posted yeyeck

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法导论插入排序相关的知识,希望对你有一定的参考价值。

没办法就是这么没原则,又开了个坑。每天看点书,不管什么书。

1. 需求:

  输入:n个数的一个序列(a1, a2,  a3……an)

  输出: 输出序列的一个排列(a1‘, a2‘, a3‘ ……an‘),满足a1‘ <=  a2‘ <= a3‘ ……<= an‘

2. 图示:

  技术分享图片

3. 伪代码 

INSERTION-SORT(A)

for j=2 to A.length
    key = A[j]
    i = j-1
    //把A[j]插入到有序数组 A[1...j-1].
    while i > 0 and A[i] > key
        A[i+1] = A[i]
        i = i -1
    A[i + 1] = key

 

4. 理解

  算法导论不愧是本好书啊,看这伪代码的注释多精髓,

  把 A[j] 插入到有序数组 A[1...j-1]

  j是从2开始的,也就是说我们第一次就是做两个数的排序,这样就是比较A1 和 A2.,这个就容易了。这样得到A的前两个数A1 A2就是有序的

  当J = 3的时候,我们要做的就是在  * A1 * A2 * 三个星号中找到A3的位置(因为A1 <= A2 已经确定了),根据就近原则,我们先用A3跟A2比,如果比A3 比 A2小,就再跟A1比(如果A3比A2大,那肯定就比A1大了),在跟,然后得到一个新的有序序列A1 A2 A3

  当J = 4的时候   我们要做的就是在  * A1 * A2 *  A3  * 四个个星号中找到A4的位置(因为A1 <= A2 <= A3 已经确定了),根据就近原则,先跟A3比,然后A2, A1, 然后得到一个新的有序序列A1 A2 A3 A4

  以此类推

 

5.代码。因为伪代码的数组下标是从1开始的,所以一些范围判定要改一下

java  

//java
void insertionSort(int[] A) {
        for(int j = 1, len =A.length; j < len; j++) {
            int key = A[j];
            int i = j-1;
            while(i > -1 && A[i] > key) {
                A[i+1] = A[i];
                i = i-1;
            }
            A[i+1] = key;
        }
        return A;
}
//    input: 5 4 2 9 4 12 6 8 1 3 35
//    output: 1 2 3 4 4 5 6 8 9 12 35

 

C

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

python

def insertion_sort(arr):
    le = len(arr)
    for i in range(1, le):
        key = arr[i]
        j = i - 1

        while j > -1 and arr[j] > key:
            arr[j+1] = arr[j]
            j -= 1

        arr[j+1] = key

 

 

 

 

  

 

以上是关于算法导论插入排序的主要内容,如果未能解决你的问题,请参考以下文章

算法导论插入排序

算法导论插入排序

重读算法导论之算法基础

算法导论 | 循环不变式与插入排序

算法导论学习 之 插入排序

算法导论之插入排序和归并排序