什么是插入排序?
想必大家都玩过扑克牌,在玩牌的时候对牌的排序方法可以是从左往右逐渐变大,从第二张牌开始跟第一张比较,如果第二张比第一张小,则把第二张插到第一张前面。第三张跟第一第二张比较,然后在放到对应的位置上,后面的以此类推。
因为我们对牌的大小很熟悉,在打扑克时自然而然的就把扑克放在了正确的位置上。我们可以以前三张为例子思考下这个真正的过程。
- 第一步将第二张跟第一张比较,如果第二张小于第一张,则互换位置,否则不移动。
- 第二步将第三张扑克跟第二张比较,如果第二张大于第三张则将它们互换位置,接着再拿第二张(之前的第三张)跟第一张比较,如果第一张大于第二张,那将他们互换位置。
- 如果在比较时发现,前面的一张比后面的小,则中断这个比较过程。
类似对扑克排序这样的操作算法,我们称之为插入算法。
插入排序的特点
与选择排序一样,在排序过程中,当前索引左侧的元素(扑克)都是有序的,但是它们的最终位置不确定,为了给更小的元素腾出空间,它们有可能被移动。当索引达到数组的右端时,数组排序就完成了。
与选择排序不一样的是,插入排序所需的时间取决于数组的初始顺序。对一个很大且其中元素已经有序(或接近有序)的数组进行插入排序比对随机顺序的数组或逆序数组进行排序要快的多。
代码示例
public static void sort(int[] arrays) {
int length = arrays.length;
for (int i = 1; i < length; i++) {
int count = 0;
for (int j = i; j > 0 && arrays[j] < arrays[j - 1]; j--) {
System.out.println("比较次数为:" + ++count);
int key = arrays[j];
arrays[j] = arrays[j - 1];
arrays[j - 1] = key;
}
for (int m = 0; m < arrays.length; m++) {
System.out.print(arrays[m] + "-");
}
System.out.println("");
}
}
public static void main(String[] args) {
int[] aa = { 11, 9, 8, 7, 3, 9, 2 };
sort(aa);
}
11, 9, 8, 7, 3, 9, 2 | 11-9-8-7-3-9-2 | |
第一次大循环 | 比较1次 | 9-11-8-7-3-9-2 |
第二次大循环 | 比较1次 | 9-8-11-7-3-9-2 |
比较2次 | 8-9-11-7-3-9-2 | |
第三次大循环 | 比较1次 | 8-9-7-11-3-9-2 |
比较2次 | 8-7-9-11-3-9-2 | |
比较3次 | 7-8-9-11-3-9-2 | |
第四次大循环 | 比较1次 | 7-8-9-3-11-9-2 |
比较2次 | 7-8-3-9-11-9-2 | |
比较3次 | 7-3-8-9-11-9-2 | |
比较4次 | 3-7-8-9-11-9-2 | |
第五次大循环 | 比较1次 | 3-7-8-9-9-11-2 |
第六次大循环 | 比较1次 | 3-7-8-9-9-2-11 |
比较2次 | 3-7-8-9-2-9-11 | |
比较3次 | 3-7-8-2-9-9-11 | |
比较4次 | 3-7-2-8-9-9-11 | |
比较5次 | 3-2-7-8-9-9-11 | |
比较6次 | 2-3-7-8-9-9-11 |