插入排序(Insertion-sort)
一种增量式的做法
1. 特点
在处理少量数据元素进行排序的有效算法。
- 原地排序(sorted in space):在数组内进行重新排序。
2. 算法基本认识
- 代码由内外两层for循环构成,内循环做比较,外循环控制哪个是插入值。
- 排序参数是一个数组 A [1…n]。(包含n个待排序数)
- A [ j ] 先放入key变量中。
- 将数组逻辑划分为“手牌区”A [1…j-1],“”key区域=A[ j ] ” 和“待插入区”A [j+1…n](开始时手牌区为1)
- key依次从右至左依次与手牌区比较,被比较手牌区值大则向右移动,key再与左边下一个手牌值比较,直到被比较手牌小于key,key插入此值右边位置。
3. 排序过程
eg:A [5,2,4,6,1,3]
- 第一次插入,5在手牌区,2(key) 与手牌区5作比较,5向后移动。
- 第二次插入,(2,5)在手牌区,4(key)在内循环中先于5比较,5大向右移动一格,再与2比较,2小,key插入5移去的空缺位置。
- 第三次插入
- 第四次插入,key越小,移动个数多。
- 最终状态
4. java代码
int[] A= {5,2,4,6,1,3};
for(int j=1;j<A.length;j++) {
int key=A[j];
int i=j-1;
while(i>=0&&A[i]>key) {
A[i+1]=A[i];
i--;
}
A[i+1]=key;
}
//打印
for(int n:A)
System.out.print(n);
}
5. 算法分析
- 运行时间——>基本操作数(步数)
T(n)=an^2+bn+c(最坏情况)
一般情况下,我们只用分析最坏情况下的增长量级,因为当n很大时,低阶项就不那么重要了,得出 O(n^2) - 输入规模——>元素个数