插入排序的基本介绍:
插入排序是对想要排序的序列以插入的方式寻找该元素的适当的位置,从而达到排序的目的。
插入排序的基本思想:
把n个待排序的元素看成一个有序表和一个无序表,开始时,有序表只有一个元素(整个序列的第一个元素看成有序表的第一个元素),无序表中有n-1个元素,在接下来的排序过程中,每次从无序表中取出一个元素,将它依次与有序表中的元素进行比较(注意:与有序表中元素比较的顺序是从后向前),将它插入到有序表中的适当的位置,使其成为新的有序表。
插入排序的基本思路图:
接下来,我会通过代码讲述插入算法的实现过程,也会通过两种方式进行讲解:分步骤的实现,整体的实现。具体的解释,我将在代码的注释中进行标注。
(1).分步骤的实现
public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = {101,34,119,1}; insertSort(arr); } //直接插入排序 public static void insertSort(int[] arr){ //第一趟排序 //因为我们第一个元素是有序表中的元素,因此我们在从无序表中取第一个元素的时候(索引为1),应该让其与它前一个元素进行比较。 //所以我们要比较元素的索引值应该是1-1=0 //之后我们将带排序的元素赋值给insertVal(因为是第一躺,所以是arr[1]) int insertIndex = 1-1; int insertVal = arr[1]; //这里面我们通过insertIndex>=0来限制数组越界 //并且当我们插入的元素小于它之前的元素时,执行该循环 while(insertIndex>=0 && insertVal<arr[insertIndex]){ //将有序列表中的元素后移 arr[insertIndex+1] = arr[insertIndex]; //当进行比较的时候,说明现在insertIndex位置的元素已经比我们待插入的元素大了,这个时候我们应该将insertIndex向前移动一位继续比较, //一直到insertIndex<0(待插入元素最小)或者找到一个比待插入元素小的数为止 insertIndex--; } //这里注意的是insertIndex+1,因为经过上述insertIndex--,我们最终得到的insertIndex比我们待插入的值少1,因此下面我们要加1,之后把insertVal插入进去。 arr[insertIndex+1] = insertVal; System.out.println("第一趟排序的结果:"); System.out.println(Arrays.toString(arr)); //第二趟排序 insertIndex = 2-1; insertVal = arr[2]; while(insertIndex>=0 && insertVal<arr[insertIndex]){ arr[insertIndex+1] = arr[insertIndex]; insertIndex--; } arr[insertIndex+1] = insertVal; System.out.println("第二趟排序的结果:"); System.out.println(Arrays.toString(arr)); //第三趟排序 insertIndex = 3-1; insertVal = arr[3]; while(insertIndex>=0 && insertVal<arr[insertIndex]){ arr[insertIndex+1] = arr[insertIndex]; insertIndex--; } arr[insertIndex+1] = insertVal; System.out.println("第三趟排序的结果:"); System.out.println(Arrays.toString(arr)); }
上述代码最终的结果如下所示:
(2).整体的代码实现
public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = {101,34,119,1}; insertSort(arr); } //直接插入排序 public static void insertSort(int[] arr){ //直接插入排序 //通过上面的步骤,我们知道执行插入排序我们只需要每次改变i的值即可。 //因此整体的代码如下 for(int i=1;i<arr.length;i++){ //这里面的i需要小于arr.length,因为我们也要与无序序列中的最后一个元素进行比较。 int insertVal = arr[i]; int insertIndex = i-1; while(insertIndex>=0 && insertVal<arr[insertIndex]){ arr[insertIndex+1] = arr[insertIndex]; insertIndex--; } arr[insertIndex+1] = insertVal; System.out.println("第"+i+"趟的排序:"); System.out.println(Arrays.toString(arr)); } }
上述代码的最终结果如下: