关于直接插入排序,本人不再赘述概念,当初我搞懂这些也研究了很久,我希望能够用最简单的语言来说清楚这个东西
在贴代码之前,用一个例子给各位一个最直观的感受(默认从小到大排序):
现在要将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大的都已经后移了一位了