第二章 算法入门
2.1 插入排序
首先介绍一下基本的排序算法,插入排序。
想象一下当我们在斗地主的时候,我们在一张一张抽牌的过程中总是在拿手中的牌与之前已经排好序的牌进行比较,并将新的牌插入到合适的位置。整个过程如果放慢来看,那么就是用新的牌(M)从第一张牌开始比对,直到遇到一张比M大的
牌才停下,并放在其前面。当然因为人比机器聪明,不仅会从前往后从后往前也会从中间往两边走。
这里先贴一下插入算法,我先介绍一下这个算法的大致意思。
Insertion-sort(A):
for i = 1 to A.length
key = A[i]
j = i -1
while(j > 0 and A[j] > key):
A[j+1] = A[j]
j = j - 1
A[j+1] = key
1. 算法名称 Insertion-sort,A是输入参数(这里表示数组)。
2. for 在算法中表示循环的意思(while同理),定义一个变量 i = 1,每次完成一次循环操作i都加1,当i等于A的长度时,循环结束。(编程语言下标大部分)
3. 定义一个变量key为A中下标(index)为i的数
4. 定义一个变量j=i-1,即i前面一个数
4. while(循环进行条件).
5,6 .前后交换位置,同时对照下标前移一位
7. 最后j所停止的位置后一位赋予key值。
这里插一张书上的图, 来分析:
核心思想是对照交换,举个例子你手中抽到的牌是524613, 首先你会看第二张牌2[i=1]很第一张牌5[j=i-1]的大小,5>2满足while条件,那么我们需要进行A[j+1] = A[j], A[1] = A[0] = 5, 此时牌序变成了554613, 这时需要再往前对照,那么j-1=-1。这时候不满足条件所以,循环退出了,那么这里我们的key要放在指针j的后一位那么就是A[0] = 2, 牌序变成254613。
之后的步骤大家用上面的例子再推一推就能很好的理解这个算法了。
算法的优劣是通过计算时间复杂度来判读的,那么这个算法的时间复杂度(这里我们只讨论循环次数)可以这样理解:
循环次数记为 *tj
最优情况:正序
倒序:
当n取很大的时候,其他常数项和n项可以忽略,所以算法的时间复杂度为n^2.
Insertion-sort(A): times
for i = 1 to A.length n
key = A[i] n-1
j = i -1 n-1
while(j > 0 and A[j] > key): tj
A[j+1] = A[j] tj-1
j = j - 1 tj-1
A[j+1] = key n-1
如果内容有误,欢迎大家留言区指教,互相探讨。