由于长期不去上课,今天去上算法课直接被全班同学虐了,连一个简单的直接插入排序都写不出来,回到苏浙赶紧看了之后自己做了一下。
看了许多博客,大概思想是这样的,你手里有一张牌假如是6,然后用手去抓拍如果抓到的比6大就放在6的后面,如果比6小,就放在6的前面,这样每次抓到牌都可以根据牌的的大小插入前面的序列,这样最后得到的序列就是有序序列。
例如:
一共有10个箱子
抓取 | 抓到的牌 | 序列 | 插入策略 |
---|---|---|---|
1 | 6 | 6 | 只有一个6所以不用分析,直接放入第一个箱子 |
2 | 8 | 6 , 8 | 8比6小,所以8插入6的后面,即第二个箱子 |
3 | 3 | 3,6,8 | 3先和8比,3比8小所以把8后移一位放到第三个箱子,3和6比,3比6小,所以6后移一位放到第二个箱子,把3插进第一个箱子就变成3,6,8 |
4 | 9 | 3,6,8,9 | 9和8比,9比8大那么直接把9放入四个箱子 |
5 | 1 | 1,3,6,8,9 | 1依次和9,8,6,3相比,它们都比1大,所以把它们都往后移动一个箱子,把1放入第一个箱子 |
总结一下就是每次拿到一个数就和前面的数字比较,如果符合条件,就把符合条件的数字往后移动直到遇到不符合条件的数,则抓到的数就放在这个数的后面。
例如:数组有5个元素
{3,6,4,8,5}
经过三次排序变成{3,4,6,8,5}
现在第四次排序轮到8,那么8先和6比较,6<8所以8不用动位置,因为6和6之前的序列是有序的。
第五次排序轮到5, 5先和8比较,5<8所以把8向后移动一个位子即移动到了5之前的位子,现在变成了{3,4,6,8,8}
5继续和6比较,6>5所以6向后移动一个位置,即移动到了8之前的位置现在变成了{3,4,6,6,8,9}
5继续和4比较5<4所以就把5放在4后边,现在变成了{3,4,5,6,8,9}排序就完成了。
最后上代码:
private static void sort(int[] nums) {
//每次需要比较的数设为N
int l=nums.length;
//第1个数不需要插入,所以i初始值为1.
for(int i=1;i<l;i++){
//先把N从箱子里面拿出来
int temp=nums[i];
//N首先和前面箱子里面的数进行比较
int j=i-1;
//当箱子存在&&N比前一个数小的时候
while(j>=0&&temp<=nums[j]){
//将j箱子里面的数向后移动一个位置
nums[j+1]=nums[j];
//继续和前面箱子的数字进行比较
j--;
}
//因为最后一个数字<N,所以就把N放在这个数后面的箱子
nums[j+1]=temp;
}
for (int s : nums) {
System.out.println(" "+s+" ");
}
}
看来以后还是要好好学习算法啊~~~~
===========================2016.7.28更新,发现了一种更加清晰的代码。
private static void insertSort(int[] num) {
for (int i = 0; i < num.length-1; i++) {
int begin=i;
for (int j = i+1; j >0; j--) {
if(num[j]<num[begin]){
swap(num,j,begin);
begin--;
}else{
break;
}
}
}
}