插入排序—直接插入

时间:2021-04-26 11:14:22

关于直接插入排序,本人不再赘述概念,当初我搞懂这些也研究了很久,我希望能够用最简单的语言来说清楚这个东西

在贴代码之前,用一个例子给各位一个最直观的感受(默认从小到大排序):

现在要将16插入一个有序的序列S:5,13,20,33,插入排序的做法是让序列S从后往前和16一个一个比,找出比16小的那个数的位置,插入到这个数的后面即可

注意一点,我们找到符合条件的值是13,所以我们应该把16放在13的后面,也就是20的位置,让20和33的位置都后移一位

public static void main(String []args){
		int a[] = {4,6,2,7,9,5,3,7,9,};//要排序的数组
		int i, j;//很多地方都要用i,j,直接声明在这了
		
		System.out.println("排序之前的数组为:");
		System.out.println("排序之前的数组为:");
                printArr(a);//输出数组
	        //以下是插入排序的核心代码
                for(i=1; i<a.length; i++)
		{
			int t = a[i];//a[i]就是要插入的元素
			for(j=i-1; j>=0; j--){//从这里也可以看出,j--:倒着比,一直必到a
				if(a[j]>t){
					a[j+1] = a[j];//如果大于就后移一位
				}
				else
					break;//只要一找出来这个位置就不用再找了,此时j不会执行j--
			}
			System.out.print("j="+j+"\t");//可以打印j证明
			a[j+1] = t;//当初很长一段时间没明白这行的意思:要插入的位置,下面详细说明一下
		}
		System.out.println();
                System.out.println("排序之后的数组为:");
                printArr(a);
	}
a[j+1] = t:要插入的位置,如果不明白这里,看下面的说明:
假设2,4,6,7,9是已完成排序的有序序列S,要将5插入,我们来写写for循环的步骤
<1> t=a[5]=5
<2> j=i-1=4-->a[4]=9>5,不是要找的插入位置,将a[4]后移以为,即a[5]=9,然后j=j-1
<3> 一直循环到a[1]=4,发现a[1]不大于5,执行else,退出内层循环
<4> 那么5应该插入到a[1+1]=a[2]的位置,在第<2>步中,比5大的都已经后移了一位了