1.直接插入排序的引入
在理解直接插入排序,可以从生活中的一些实例出发。在扑克牌的规则中有一种出牌的方式是顺子,也就是打出一组连续数字的牌,所以我们经常需要对手中的牌进行排序操作。人们经常对手中的牌如何排序?
举个例子:比如我手里面有红桃6,7,9,10这四张牌,已经处于升序状态。
这个时候我又拿到一张红桃8,如何将手中的五张牌重新处于升序状态?用冒泡排序,还是选择排序?
就像玩牌一样,排序算法也是利用类似的思想:维护一个有效区,把元素一个一个插入到有序区的适当位置,直到所有元素有序为止。
2.插入排序的算法步骤
假设给定一个无序数组,给定的无序数组如下
把数组的首元素5作为有序区,此时有序区只有这一个元素:
第一轮
让元素8与有序区的所有元素依次进行比较。
元素8>5,所以元素8与元素5无需进行重新排序。
此时有序区的元素增加到了两个。
第二轮
让元素6与有效区的所有元素依次进行比较。
元素6<8,将元素6与元素8进行交换。
元素6>5,元素6与元素5无需交换顺序。
此时有序区的元素增加到了三个。
第三轮
让元素3与有序区的所有元素依次进行比较。
元素3<8,将元素8与元素3交换顺序。
元素3<6,将元素6与元素3交换顺序。
元素3<5,将元素5与元素3交换顺序。
此时有序区的元素增到到四个:
依次进行了类推,插入排序一共进行(数组长度-1)轮,每一轮的插入排序的结果为:
3.插入排序的代码实现
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int [] arr={
5,8,6,3,9,2,1,7};
//插入排序
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
if(arr[j]<arr[i]){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
j--;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
输出的结果为: