一、插入排序
1、插入排序类似玩扑克牌,摸牌的时候,摸到小的牌就和手中的牌比较,如果这张牌大于前面的牌则插入,否则的话继续和前面的牌比较,直到这张牌为第一张获取比前面牌大的时候,再继续摸牌。
2.为何只需要用摸到的这张牌和前面的牌比较?
是因为按照这样的逻辑,前面的牌已经都是排好序的,所以拿到新的牌只需要和比前面牌大即可插入
3.需要移动数组
因为是给定的数组,如果满足条件,需要在某个索引之后插入数据,那么需要将后面的数据进行移动。
比如:{2,1,4,5,6,3,4,2}
(1)假设摸到第一张牌为target = 2,那么从1开始,1 < 2,则将1放到第一个位置,2放到第二个位置。此时{1,2,4,5,6,3,4,2},此时设定第二个位置target = 2;
(2)那么新摸到牌为4,明显4 > 2,那么将target = 4,
(3)下次摸到5,5 > 4,将target = 5;
(4)下次摸到6,6 > 5,将target = 6;
(5)再下次摸到 3,此时需要注意:3 < target = 6,将6 往后移动一位,到达原来3 位置,再继续,3 < 5 ,将5往后移动一位,到达原来6的位置,再继续,3 < 4 ,将4往后移动一位,到达原来5的位置,再继续,3 > 2,此时ok了,说明需要将 3 插入到 2 的后面。以此类推。
二、代码实现
package com.daxiong.day3;
// 插入排序
public class InsertSort {
public static void main(String[] args) {
int[] data = { 44, 22, 2, 32, 54, 22, 88, 77, 99, 11 };
insertSort(data);
}
public static void insertSort(int[] data){
int i,j;
int len = data.length;
// 目标牌
int target;
for(i = 1;i < len;i++){
j = i;
target = data[i];
// 当目标值比前一个值小的话,向左持续移动
while(j > 0 && target < data[j-1]){
data[j] = data[j-1];
j--;
}
// 当目标值比前一个值大的话,就把目标值设定该位置
data[j] = target;
}
for(int m = 0; m < len;m++){
System.out.print(data[m] + " ");
}
}
}