请求对Java插入排序(insertionSort)代码进行逐行解释
插入排序代码逐行解释及示例拆解
先贴出你提到的插入排序代码:
public static void insertionSort(int[] a) { int n = a.length; for (int i = 1; i < n; i++) { int newest = a[i]; int j = i - 1; while (j >= 0 && a[j] > newest) { a[j + 1] = a[j]; j = j - 1; } a[j + 1] = newest; } }
代码逐行解释
public static void insertionSort(int[] a):定义插入排序方法,接收int类型数组作为参数,无返回值。int n = a.length;:获取数组长度,用于控制循环的边界范围。for (int i = 1; i < n; i++):外层循环从索引1开始(默认第一个元素已处于有序区间),遍历至数组末尾。int newest = a[i];:将当前待插入的元素暂存到newest中——这是你疑惑的核心:16不会丢失,它被存在这个变量里了。int j = i - 1;:初始化j为当前元素的前一个索引,用来向前遍历已排序的区间。while (j >= 0 && a[j] > newest):当j未越界,且前一个元素比待插入元素大时,进入循环。a[j + 1] = a[j];:把前一个元素向后移动一位,腾出插入位置。你说的a[1]从16变成30是对的,但16已经存在newest里,不会丢失。j = j - 1;:j向前移动一位,继续检查更前面的元素是否需要后移。a[j + 1] = newest;:退出循环时,j+1就是待插入元素的正确位置,把暂存的newest放进去,完成一次插入操作。
你的示例数组步骤拆解
示例数组:array={30,16,12,51,37,18,24,8,23,24}
第一次循环(i=1)
newest = a[1] = 16:把16暂存起来。j = 0:指向第一个元素30。- 进入while循环:
j>=0且a[0]=30>16,条件成立。- 执行
a[j+1] = a[j]:a[1] = 30,数组变为{30,30,12,51,37,18,24,8,23,24}。 j = j-1 = -1:j变为-1,退出循环。
- 执行
- 执行
a[j+1] = newest:a[0] = 16,数组变为{16,30,12,51,37,18,24,8,23,24},完成第一次插入。
第二次循环(i=2)
newest = a[2] = 12:暂存12。j = 1:指向30。- 进入while循环:
a[1]=30>12,条件成立。a[2] = 30,数组变为{16,30,30,51,37,18,24,8,23,24}。j=0。
- 继续while循环:
a[0]=16>12,条件成立。a[1] =16,数组变为{16,16,30,51,37,18,24,8,23,24}。j=-1,退出循环。
a[0] =12,数组变为{12,16,30,51,37,18,24,8,23,24},完成第二次插入。
后续循环逻辑完全一致,不断把当前元素插入到前面的有序区间里,直到整个数组有序。
内容的提问来源于stack exchange,提问作者YEREKK
相关产品推荐
相关产品推荐

