插入排序就像玩扑克牌一样,把元素按照大小插入到一个已经排好序的序列中,直到全部元素排好。
假设我们拿到了一个数组,请问我们该从哪一个元素开始着手于直接插入排序呢?
答案是:第二个元素
我们可以假设,第一步,第一个单个元素即为一个已经排好序的序列,再拿第二个元素安插到序列中。第二步,拿到第三个元素,此时前两个元素以及有序,我们可以将第三个元素依照大小放入前面的序列中。以此类推
演示:
第一步,是找到有序序列,以及需要插入的元素。
我们以需要插入的元素为i下标,有序序列的最后一个元素为j下标。
第二步,是比较插入元素和有序序列中元素的大小关系。
在比较之前,需要先把插入元素提前存放避免被覆盖。
需要得到的序列为升序序列,则有序序列中的元素比插入元素较大时,把有序序列中的元素往右移动一位,直到找到一个比插入元素小或j(j用来遍历有序序列)下标达到了0下标的位置。
需要得到降序序列,就是在前面的有序序列中找到比插入元素大的元素的右一个位置插入。
第三步,移动i下标的位置寻找下一位插入元素,再重复循环第二步直到遍历完数组。
为了节省时间,后面就不画啦,相信大家都能看懂了。
上代码。
import java.util.Arrays;
public class Test {
public static void insertSort(int[] array){
for(int i = 1; i < array.length; i++){
int tmp = array[i];//存放好插入元素
int j = i - 1;
for(; j >= 0; j--){
if(array[j] > tmp){//如果插入元素小于有序序列中的元素
array[j+1] = array[j];//则j下标的元素往右移动一位
}else{
break;//如果大于或等于,则证明tmp元素比j下标的元素大,可以安插到j+1位置
//且之前的序列都是有序的,记住我们前面的序列一直是一个有序序列
}
}
array[j+1] = tmp;
}
}
public static void main(String[] args) {
int[] array = {12,89,2,4,61,50};
insertSort(array);
System.out.println(Arrays.toString(array));
}
}