【算法导论】插入排序

简介: 没办法就是这么没原则,又开了个坑。每天看点书,不管什么书。 1. 需求:   输入:n个数的一个序列(a1, a2,  a3……an)   输出: 输出序列的一个排列(a1', a2', a3' ……an'),满足a1'

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

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

 

 

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

 

 

  

 

 

 

 

 

 

 

 

  

 

相关文章
|
2月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
18 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
2月前
|
搜索推荐 算法
【排序算法(一)】——插入排序,选择排序 —> 深层解析
【排序算法(一)】——插入排序,选择排序 —> 深层解析
|
5月前
|
算法 搜索推荐 C#
|
6月前
|
机器学习/深度学习 算法 搜索推荐
数据结构算法--2 冒泡排序,选择排序,插入排序
**基础排序算法包括冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素比较交换,逐步将最大值“冒”到末尾,平均时间复杂度为O(n^2)。选择排序每次找到剩余部分的最小值与未排序部分的第一个元素交换,同样具有O(n^2)的时间复杂度。插入排序则类似玩牌,将新元素插入到已排序部分的正确位置,也是O(n^2)复杂度。这些算法适用于小规模或部分有序的数据。**
|
6月前
|
算法 搜索推荐
数据结构与算法-插入排序
数据结构与算法-插入排序
31 2
|
6月前
|
算法 搜索推荐 数据可视化
【漫画算法】插入排序:插入宝石的传说
【漫画算法】插入排序:插入宝石的传说
|
6月前
|
人工智能 搜索推荐 JavaScript
心得经验总结:排序算法:插入排序法(直接插入法和希尔排序法)
心得经验总结:排序算法:插入排序法(直接插入法和希尔排序法)
39 0
|
6月前
|
机器学习/深度学习 搜索推荐 算法
【C/排序算法】:直接插入排序和希尔排序
【C/排序算法】:直接插入排序和希尔排序
45 0
|
6月前
|
搜索推荐 算法
排序算法之插入排序
排序算法之插入排序
45 0
|
6月前
|
搜索推荐
排序算法---插入排序-----详解&&代码
排序算法---插入排序-----详解&&代码
下一篇
无影云桌面