首先查看一张经典的插入排序的图片
有图片可知,插入排序其字面的意思找到小的插入到前面就行
插入排序的基本思想就是分治:将数组分为两个区域,分别是已排序区和没有排序的区域
已排序区:假定一边的数组是都排序好的
wei排序区:假定一边的数组是还没有排序的区域
那么如何来进行插入排序?(假定一个数组如下所示)
int []arr = {9,2,6,4,5,1,3,7,8};
- 首先假定这个数组的已经排序的区域为第0位,没有排序的区域为第0位后面的数组
- 所以第一层的循环从第一个位置开始(未排序区域)
- 用已排序区的元素分别与未排序区的元素进行比较,
- 如果未排序区的元素大于已排序区的元素那么将未排序区的元素插入进来
- 那么如何插入进去?
- 一种办法就是将已排序区域比未排序区域的第一个元素小的元素都后移
- 后移完成之后就将未排序区域的第一个元素插入进来
- 下面将具体的代码写出来,然后用上面的数组进行举例子,逐步分析插入排序的过程
import java.util.Arrays;
public class Insertiom {
public static void main(String[] args) {
int []arr = {9,2,6,4,5,1,3,7,8};
//将第0位看做已经排序好的元素,i为未排序区域的元素的下标,所以从第1位开始进行排序
for (int i = 1; i < arr.length; i++) {
//用j来表示已排序区域的元素的下标,因为第一次为0,所以为i-1
int j = i-1;
//用temp来存储未排序区域的第一个元素,即要插入的元素
int temp = arr[i];
//下面的while循环就是用temp来与已排序的区域做比较
while(j>=0){
//如果temp比已排序区域的元素小一点,那么将已排序区域的元素后移,直到所有的元素都比较完为止就break
if(arr[j]>temp){
arr[j+1] = arr[j];
j--;
}
else{
break;
}
}
//因为所有比temp大的元素都比较完了,所以j就会移到最后一个符合条件值的前一位因此是j+1;
arr[j+1] = temp;
}
System.out.println(Arrays.toString(arr));
}
}
以上就是插入排序的代码,其中while循环可以更加简单的写出来,将if的判断放到while里面,单个人感觉以上的代码更好理解一点
接着对以上的程序进行debug,就可以知道其具体的运行过程
第一次刚进入程序时如图所示
第一次if判断成功后,将第一位的9向后移动了一位,这时候j–的话就会变为-1,就会到与其刚才比较的前一位,因此在j的前一位可以插入未排序区域的值
这样第一次所有的比较就做完了,然后就是i++。
将已排序的区域增加,然后就是重复操作,大家可以自己debug一下。
**以上就是我对插入排序的一点浅见,欢迎大家留言**