插入排序(Insertion sort)
1.什么是插入排序
工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
简单来说插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。
2.算法步骤
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。
3.动图演示
4.代码实现
public static void main(String[] args) {
int[] arr = {5,3,1,4,2,7,8,6,10,9};
for (int i = 0,j = i; i < arr.length - 1; j = ++i) {
//默认0下标是有序的,获取从0开始的下一个元素
int temp = arr[ i + 1];
//如果下一位元素是比上一位小的
while (temp < arr[j]){
//把上一位存放在下一位中,这个时候就会覆盖下一位的值,不过我们已经存在temp中
arr[j + 1] = arr[j];
//当j == 0的时候则说明已经到头
if(j -- == 0){
break;
}
}
//把最小的值写入当前位置
arr[j + 1] = temp;
}
System.out.println(Arrays.toString(arr));
}
另一种写法:
public static void main(String[] args) {
int[] arr = {5,3,1,4,2,7,8,6,10,9};
// 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
for (int i = 1; i < arr.length; i++) {
// 记录要插入的数据
int tmp = arr[i];
// 从已经排序的序列最右边的开始比较,找到比其小的数
int j = i;
while (j > 0 && tmp < arr[j - 1]) {
arr[j] = arr[j - 1];
j--;
}
// 存在比其小的数,插入
if (j != i) {
arr[j] = tmp;
}
}
System.out.println(Arrays.toString(arr));
}
5.输出结果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。