博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法导论】插入排序
阅读量:6823 次
发布时间:2019-06-26

本文共 2514 字,大约阅读时间需要 8 分钟。

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

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  

//javavoid 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 插入排序过程

31,   41,  59,   26,   41,   5831,   41,  59,   26,   41,   5831,   41,  59,   26,   41,   5831,   41,  26,   59,   41,   5831,   26,  41,   59,   41,   5826,   31,  41,   59,   41,   5826,   31,  41,   41,   59,   5826,   31,  41,   41,   58      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 ireturn 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 =  0for i = A.length to 1     sum = A[i] + B[i] + flag     C[i+1] = sum % 2     flag = sum / 2C[1] = flag

 

 

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

 

 

  

 

 

 

 

 

 

 

 

  

 

转载于:https://www.cnblogs.com/yeyeck/p/9514371.html

你可能感兴趣的文章
《Apache kafka实战》读书笔记-kafka集群监控工具
查看>>
简单工厂
查看>>
【模板】矩阵快速幂
查看>>
AJAX笔记
查看>>
cadence 封装制作小结
查看>>
AFNetwork 作用和用法详解
查看>>
登录linux,输入ls显示anaconda-ks.cfg cobbler.ks ....., 原因在于root@ ~ / 区别
查看>>
虚拟机CentOS6.5网络配置
查看>>
bzoj2563 阿狸和桃子的游戏
查看>>
概念整理3
查看>>
《Hadoop基础教程》之初识Hadoop
查看>>
转:前端单元测试总结
查看>>
【LeetCode每天一题】 Intersection of Two Linked Lists(两个链表的入口节点)
查看>>
spring mvc 用ajaxSubmit 在iE8上传文件变下载的问题
查看>>
Nginx 负载均衡动静分离配置
查看>>
laravel, Composer和autoloading
查看>>
算法整理-二叉树和堆栈
查看>>
如何设计一个“高大上”的 logo
查看>>
clustalo安装
查看>>
[日常] Go语言圣经--示例: 并发的Clock服务习题
查看>>