写在前面的话
今天开始也要看看
算法导论
这本书了,开个长久的帖子记录一下学习笔记以及感悟,也希望这是一种变相督促自己学习的办法:)。
之前也读书的时候算法这里也只学过数据结构,但是感觉自己只学会了部分思想,真要去leetcode
去刷算法题未免太过吃力,看到别人推荐这本书,就找来了一本pdf版的好好学习一下,希望为时不晚。
封面镇楼
插入排序
输入:n个数的一个序列:x1,x2,x3,x4…xn;
输出:满足升序排序,要求前面的数字都比后面小
借用原书中的一张图来代表这个排序的意思
- 图解:如上图,扑克牌应该人人都玩过,当拿到n张牌后,你也已经排序好了。如果此时再拿到一张牌,又想让一手的扑克牌有序,你会选择怎么把新拿到的那张牌塞进牌中呢?
- 大多数人办法是,从后面开始比较,如果第n张牌比想塞的牌大,就往前继续比较,如果倒数第二张(n-1)还是大,就继续往前,直到碰到一张
小
的牌。如上图的7插到5后面,而不是10的后面。
用一张图动态表示(转自菜鸟教程,侵删):
放上一个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>=0) && (arr[j]>key)) {
arr[j+1] = arr[j];
j--;
}
arr[j+1] = key;
}
}
Java:
void insertionSort(byte[] array) {
byte key;
int j;
for (int i = 1; i < array.length; i++) {
key = array[i];
j = i - 1;
while (j >= 0 && array[j] > key) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}
}