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