插入排序
一、适用场景
适用于对少量元素进行排序。
二、插入排序思想
插入排序类似于整理手里的牌,开始手是空的,所有牌都放在桌子上,一张一张插入到手中。手中的牌是有序的,新放一张牌只需在手中为该牌腾出一张牌的位置,以此类推,所有牌将有序放于手中。插入排序亦基于该思想。
证明该思想的正确性:
1、假如A[1..i-1](i 从 2 -> Length[A]) 是有序的,则将A[i]插入到arr[1..i]中合适的位置可使A[1..i]有序。
2、i=2时即只有一个元素,显然有序。当i 取Length[A]时则arr[1..Length[A]]有序,即整个数组A有序。
故插入排序可保证数组有序。
三、插入排序伪代码描述
insertSort(A)
for i <- 2 to Length[A]
do key <- A[i]
Δ 从A[i] 插入到A[1..i-1]
j <- i-1
while j > 0 and A[j] > key
do A[j+1] <- A[j]
j <- j - 1
A[j+1] = key
四、程序实现(C++/JAVA)
//T 为任意支持 “>” 操作的数据类型
void insertSort(T A[],int length)//length为数组(从下标为1开始)元素个数
{
//一个元素是有序的,故从第二个元素开始插入数据
for(int i=2;i<=length;i++)
{
T key = A[i];
//将元素arr[i]插入到arr[1..i-1]
int j = i-1;
//若元素比key大,则向后移动
while(j > 0 && A[j] > key)
{
A[j+1] = A[j];
j--;
}
//将key(arr[i])放置于arr前i+1个元素应在的位置
A[j+1] = key;
}
}
五、伪代码描述约定
1、书写上的“缩进”表示程序中的分程序结构;
2、while、for、repeat等循环结构和if、else条件结构和pascal相同;
3、符号Δ表示后面部分为注释;
4、变量i,j,key局部于特定过程,不能不加显式声明就是用全局变量;
5、多重复制i <- j <- e 是将表达式e的值赋予i和j;
6、参数按传值方式传递给一个过程。
7、布尔运算符“and”和“or”都具有短路能力。
8、数组元素的取值是有数组名后跟"[下标]"表示。A[j]表示数据A的第j个元素。
9、复合数据一般组织成对象,它们是由属性(attribute)或域(field)所组成的