上套路,先来一通理论:
1、基本思想:
把 n 个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素(也就是第一个元素),无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,使其依次与有序表中的元素进行比较,从而将它插入到有序表中的适当位置,使之成为新的有序表。
2、以【48,38,65,13,27】这组待排序的数组为例:
我们通过上边的例子可以发现:
n个元素的待排序数组,需要进行n-1次插入排序
3、分步代码实现:
int[] arr = {48, 38, 65, 13, 27}; //待插入的元素 int insertValue; //待插入元素所在位置的前一个位置(因为要一次比较前边的元素) int index; //==============第一次插入=================== //默认第一个数是已经处于有序表中了 //所以将第二个数进行插入排序 insertValue = arr[1]; index = 1 - 1; //依次比较前边的每一个元素 //此处必须index>=0在前边,否则的话会报数组越界 while (index >= 0 && arr[index] > insertValue) { //如果前边的元素比待插入的元素大,就后移 arr[index + 1] = arr[index]; index--; } //当前边的某个元素不再比待插入的元素大,就将待插入的元素插入 //而此时在经过上边while循环过后 //此时index指向的是比待插入元素小的那个元素的位置,而待插入元素要插入在这个元素的后边 //所以在index+1处插入 arr[index + 1] = insertValue; System.out.println(Arrays.toString(arr)); //===============第二轮================== //将第三个数进行插入 insertValue = arr[2]; index = 2 - 1; while (index >= 0 && arr[index] > insertValue) { arr[index + 1] = arr[index]; index--; } arr[index + 1] = insertValue; System.out.println(Arrays.toString(arr)); //==================第三轮================ //插入第四个数 insertValue = arr[3]; index = 3 - 1; while (index >= 0 && arr[index] > insertValue) { arr[index + 1] = arr[index]; index--; } arr[index + 1] = insertValue; System.out.println(Arrays.toString(arr)); //====================第四轮======================== //插入第五个数 insertValue = arr[4]; index = 4 - 1; while (index >= 0 && arr[index] > insertValue) { arr[index + 1] = arr[index]; index--; } arr[index + 1] = insertValue; System.out.println(Arrays.toString(arr));
通过分步的实现,可以将每一步使用循环来实现,代码如下:
//默认第一个元素已经是排好序的,所以从第二个元素开始 for (int i = 1; i < arr.length; i++) { //要插入的值 insertValue = arr[i]; //从当前位置的前一个位置开始向前查找合适的位置 index = i - 1; while (index >= 0 && arr[index] > insertValue) { //后移 arr[index + 1] = arr[index]; index--; } //★★★★★★★★★★★★★★★★★★★★★★★★★★★ arr[index + 1] = insertValue; //★★★★★★★★★★★★★★★★★★★★★★★★★★★ }
欧了,代码中注释部分解释的应该挺详细的了,我是小K,勇敢做自己,做最好的自己=。