You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求对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)

  1. newest = a[1] = 16:把16暂存起来。
  2. j = 0:指向第一个元素30。
  3. 进入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,退出循环。
  4. 执行a[j+1] = newest:a[0] = 16,数组变为{16,30,12,51,37,18,24,8,23,24},完成第一次插入。

第二次循环(i=2)

  1. newest = a[2] = 12:暂存12。
  2. j = 1:指向30。
  3. 进入while循环:a[1]=30>12,条件成立。
    • a[2] = 30,数组变为{16,30,30,51,37,18,24,8,23,24}。
    • j=0。
  4. 继续while循环:a[0]=16>12,条件成立。
    • a[1] =16,数组变为{16,16,30,51,37,18,24,8,23,24}。
    • j=-1,退出循环。
  5. a[0] =12,数组变为{12,16,30,51,37,18,24,8,23,24},完成第二次插入。

后续循环逻辑完全一致,不断把当前元素插入到前面的有序区间里,直到整个数组有序。

内容的提问来源于stack exchange,提问作者YEREKK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:40:44