• 【算法导论】插入排序


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

    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

    6.  作业 题目我就不抄了,算法导论第三版

    2.1-1 插入排序过程

    314159264158
    
    314159264158
    
    314159264158
    
    314126594158
    
    312641594158
    
    263141594158
    
    263141415958
    
    2631414158      59

    2.1-2:非升序排序伪代码

    for i=2 to A.length
        j = i - 1
        key = A[i]
        
        while j > 0 and A[j] < key
            A[j+1] = key
            j = j-1
        A[j+1] = key

    2.1-3

    for i = 1 to A.length
        if v == A[i] 
            return i
    return NIL

    2-1-4

      输入:两个存储二进制整数的 n 元序列 A =(a1, a2, a3, ……an)和 B = (b1, b2, b3……bn), a1......an, b1.......bn只能为1或0

      输出:一个存储二进制整数的 n+1 元序列 C。C存储的二进制整数为A和B之和

    flag =  0
    for i = A.length to 1
         sum = A[i] + B[i] + flag
         C[i+1] = sum % 2
         flag = sum / 2
    C[1] = flag

    这个伪代码也是根据介绍伪代码的标准瞎写

      

      

  • 相关阅读:
    Thrift安装编译指南
    Linux磁盘与文件系统管理
    你懂得C,所以C++也不在话下
    加速NFV(网络功能虚拟化)数据面:SR-IOV和DPDK[原文意译]
    十张图看懂SDN与NFV的区别与联系?
    Lambda表达式用法
    论文写作+gnuplot制图
    私钥、公钥、数字签名和数字证书
    synchronized和Lock的异同
    介绍HTTP协议的传输过程
  • 原文地址:https://www.cnblogs.com/yeyeck/p/9514371.html
Copyright © 2020-2023  润新知