您的位置:首页 > 其它

经典算法(三):插入排序

2016-12-29 23:19 155 查看
小葵花课堂开课啦!孩子算法老不好,多半是没浏览我滴博客,只要多浏览我滴博客就会好!!最近,某某人要换工作,我说最近在学习算法,然后就惹到某某人了,不更新算法博客,那家伙大男子主义,哎呀妈呀,受不了,希望大家可怜可怜我这被逼写博客的心情,多多访问,多多交流!!(不好,眼泪流到键盘上了),不废话了,言归正传!

一、算法描述

插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序;第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中;第二次,数组前两个元素组成有序的数组,将数组第三个元素插入由两个元素构成的有序数组中……第N-1次,数组前N-1个元素组成有序的数组,将数组的第N个元素插入由N-1个元素构成的有序数组中,则完成了整个插入排序。

是不是看到这啰里啰唆的定义,就很反感了呢,举个栗子,以下4个数为例:

4 3 1 2

第1次插入:3 4 1 2

第2次插入:1 3 4 2

第3次插入:1 2 3 4

请看下面图解:



其中 (a)代表第1次情况,(b)代表第2次情况,(c)代表第3次情况。以第2次为例,首先插入的数位置要与它前面的数进行比较,所以 1先与4进行比较,4>1,所以,4要右移;然后再与3进行比较,3>1,所以,3要右移,所以1的位置在最顶端(最左边)。

二、算法实现

public class InsertSort {

public static void main(String[] args) {
int arrs[] = { 1, 8, 9, 45, 36, 15, 7, 36, 190, 699, 100 };
int temp;
// 从第二个数进行插入
for (int i = 1; i < arrs.length; i++) {
// 待插入的数
temp = arrs[i];
int j = 0;
for (j = i; j > 0 && arrs[j - 1] > temp; j- -) {
arrs[j] = arrs[j - 1];
}
arrs[j] = temp;
}
for (int i = 0; i < arrs.length; i++) {
System.out.print(arrs[i] + "\t");

}
}

}


是不是有些地方不明白,我刚开始也是很不明白,下面我来解释一下,首先第二个for循环的判断条件,我们说过要与插入位置前面的数进行比较,但是只有前面的数大于插入的数我们才需要执行这个for循环,才能进行里面的右移操作。

有些人可能认为为什么后面还要对arrs[j]进行赋值,其实跳出循环的时候,我们的J已经执行一次减减操作,所以现在这个J的位置也就是我们想要插入的位置,所以需要把要插入的数进行赋值。

最后,看一下运行结果:



三、总结

是不是感觉算法没有想象中的特别难,插入排序适合像一个有序的数组里面插入一个数的场景,这样会节省很多时间,但是数组不要过长,否则一样会很慢的哟!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: