插入排序代码实现与详解
插入排序代码实现与详解
1.基本思想
插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
2.明确
首先要明确,当有n个元素时,则需要n-1次插入,为什么是n-1呢 因为初始有序表只有一个元素时,这个元素不需要进行比较插入。之后的n-1个元素才需要在有序表中进行比较插入。
3.代码实现(代码以升序为例,采用java实现)
private static void insertSort(int[] nums){ int n =nums.length; int indexval=0; //当前要插入节点值 int preindex=0; //当前要插入节点的前一个节点 for (int i = 1; i < n; i++) { indexval=nums[i]; preindex=i-1; while(preindex>=0 && nums[preindex]>indexval){ nums[preindex+1]=nums[preindex]; preindex--; } nums[preindex+1]=indexval; System.out.println("第"+i+"次插入"); System.out.println(Arrays.toString(nums)); } }
输入:{130,35,109,1}
输出:
第1次插入 [35, 130, 109, 1] 第2次插入 [35, 109, 130, 1] 第3次插入 [1, 35, 109, 130] 最终结果:[1, 35, 109, 130]
4.代码详解
上述代码实现从小到大排序,那么基本思想中描述的有序表和无需表分别在nums数组的左侧和右侧,而indexval记录的就是当前无序表的第一个元素,这个元素要通过while循环与前面的有序表中元素进行比较,找到合适的位置就插入。
while条件中preindex>=0 && nums[preindex]>indexval,preindex>=0保证前一个元素的下标没有越界,如果因为这个条件不满足跳出循环,说明当前元素是目前有序表中最小的,它就被放在了第一个位置。nums[preindex]>indexval就是控制从小到大的排序的条件,一直到找到比indexval小的元素就找到了插入位置。
while循环中nums[preindex+1]=nums[preindex]; 这句也很关键,把比indexval大的元素向后移动一位,这样保证了之后插入indexval的时候不会覆盖别的元素。
5.总结:
思路就是不断取出无需表的第一个元素,在有序表中从后向前比较,找到插入位置插入。