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

插入排序未将数组首个元素纳入排序的原因排查

插入排序首元素未被纳入排序的原因分析

问题描述

尝试用插入排序对数组排序时,数组首个元素未被纳入排序范围,代码如下:

namespace InsertionSort
{
    class Program
    {
        static void Main(string[] args)
        {
            int min = 0, max = 40;
            int[] array1 = new int[10];
            Random randNum = new Random();
            for (int i = 0; i < array1.Length; i++)
            {
                array1[i] = randNum.Next(min, max);
            }
            foreach (var item in array1)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine("***************");
            
            for (int j = 1; j < array1.Length; j++)
            {
                int key,i;
                key = array1[j];
                i = j - 1;
                while ((i>0)&&array1[i]>key )
                {
                    array1[i + 1] = array1[i];
                    i = i - 1;
                }
                array1[i + 1] = key;
            }
            foreach (var item in array1)
            {
                Console.WriteLine(item);
            }
        }
    }
}

输出表现为:数组首个元素仍处于无序状态,其余元素已按插入排序规则排列。

问题原因

问题出在while循环的条件判断上:
原代码中循环条件是(i>0)&&array1[i]>key,当i递减到0时,循环直接终止,不会将当前key与数组的第0个元素(首个元素)进行比较和交换。这就导致首个元素永远不会被后续的元素插入操作所覆盖或调整,相当于被排除在了排序逻辑之外。

修正方案

将while循环的条件从i>0改为i>=0,这样就能确保key可以和数组的所有前置元素(包括首个元素)进行比较:

for (int j = 1; j < array1.Length; j++)
{
    int key,i;
    key = array1[j];
    i = j - 1;
    // 修改此处的条件,将i>0改为i>=0
    while ((i>=0)&&array1[i]>key )
    {
        array1[i + 1] = array1[i];
        i = i - 1;
    }
    array1[i + 1] = key;
}

修改后,插入排序会正常处理首个元素,整个数组都能被正确排序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:54:20