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

嵌套for循环实现的插入排序结果异常,请求排查错误原因

插入排序实现问题分析与修正

你的代码核心问题出在内层循环的终止逻辑上:

  • 原代码的内层for循环会从j = i-1一直遍历到j = -1,无论当前arr[j]是否大于key。哪怕遇到比key小或相等的元素,循环仍会继续执行,导致所有前面的元素都被向后移动一位,最终key被强制放到数组的起始位置,完全违背了插入排序“找到合适位置插入”的逻辑。

插入排序的正确逻辑是:遍历已排序区间的元素,只要当前元素大于key,就将其向后移动;一旦遇到不大于key的元素,就停止遍历——此时的位置就是key应该插入的地方。

修正后的代码

#include <stdio.h>

int main() {
    int i, j;
    int arr[] = {32, 5, 45, 8, 17, 82, 10};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    printf("Before Sorting: ");
    for (i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    
    for (i = 1; i < size; i++) {
        int key = arr[i];
        // 将arr[j] > key加入循环条件,遇到不大于key的元素立即终止循环
        for (j = i - 1; j >= 0 && arr[j] > key; j--) 
        {
            arr[j + 1] = arr[j];
        }
        arr[j + 1] = key;
    }
    
    printf("\nAfter Sorting: ");
    for (i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

修正说明

把arr[j] > key的判断从循环体的if语句,移到for循环的条件中。这样当arr[j] <= key时,循环会立刻停止,此时j的位置指向最后一个大于key的元素的前一位(如果j=-1则说明所有已排序元素都大于key),最后将key插入到j+1的位置,就能得到正确的排序结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:54:50