插入排序的基本思想:每次将一个待插叙的记录按其元素的大小插入到一个已经排好序的有序序列中,直到全部记录排好序。
(对排序的个人感悟,有错请指出)我发现基本上所有的排序算法都会涉及到将所有要排序的元素分为有序区和无序区。排序无非就是另无序区的元素减一,另有序区的元素加一。知道所有的元素都在有序区中。至于算法的效率就是我们每次从无序区中提取要排序元素的个数。
想象你正在打扑克牌,当你摸到一张牌时,会根据它的大小将它插入到你牌堆的合适位置。这时候你手中的牌,就相当于有序序列,你摸到的牌是待排序的元素,而桌面上的牌堆相当于无序区的元素。这个打牌的例子就是我们直接插入排序的实现过程。
例如:5,1,3,4,2
首先第一个元素将其单独拿出来,就形成了一个有序区,然后再从无序区中提取一个1,1<5;故将1放在5的前面而5的下标要后移一位。
插入排序的实现代码:
public class InsertSort {
public static void insert(int[] arr) {
for (int j = 1; j < arr.length; j++) {
// 控制要插入的元素。因为第一个单独形成有序区,
// 故从第二个开始提取元素。
int key = arr[j];
int i = j - 1;
while (i >= 0 && arr[i] > key) {
arr[i + 1] = arr[i];
i--;
// 将比key大的元素向后移
}
arr[i + 1] = key;
}
}
public static void main(String[] args) {
int[] arr = { 5, 1, 6, 2, 3, 26, 7, 2 };
insert(arr);// 调用刚刚定义的方法测试排序结果
for (int i : arr) {
System.out.print(i + " ");
}
}
}
最后结果如下: