排序算法 -- 插入排序

原理

插入排序是一种基于比较的排序算法,其基本思路是将数组分成已排序和未排序两个部分。算法通过逐步将未排序部分的元素插入到已排序部分的合适位置,从而实现整个数组的排序。

工作步骤

1、初始化

  • 从数组的第二个元素开始(下标为1),因为第一个元素(下标为0)可视为是一个只有一个元素的已排序部分。

2、迭代未排序部分

  • 对于每个元素(称为key),在已排序部分中寻找其正确位置。
  • 使用一个索引(j)来跟踪已排序部分的元素。

3、比较与移动

  • 从已排序部分的最后一个元素开始(即array[j]),判断其是否大于key
  • 如果是,则将array[j]移动到array[j+1]位置,继续向左比较。
  • 如果不是,则找到key的合适插入位置(即j + 1)。

4、插入元素

  • 当找到合适位置后,将key插入到该位置。

5、重复

  • 重复步骤2到步骤4,直到整个数组被处理完。

代码

using System;  

class Program  
{  
    static void InsertionSort(int[] array)  
    {  
        for (int i = 1; i < array.Length; i++)  
        {  
            int key = array[i];  
            int j = i - 1;  

            // 将 key 插入已排序的部分  
            while (j >= 0 && array[j] > key)  
            {  
                array[j + 1] = array[j];  
                j--;  
            }  
            array[j + 1] = key;  
        }  
    }  

    static void Main(string[] args)  
    {  
        // 示例数组  
        int[] arr = { 5, 2, 4, 6, 1, 3 };  

        Console.WriteLine("原始数组: " + string.Join(", ", arr));  
        InsertionSort(arr);  
        Console.WriteLine("排序后的数组: " + string.Join(", ", arr));  
    }  
}

例子

假设我们要对数组 [5, 2, 4, 6, 1, 3] 进行插入排序,下面是每一步的详细过程:

  • 初始状态:

    [5, 2, 4, 6, 1, 3]  
     ↑  
     已排序部分
  • 第1步(i=1,key=2):

    • 2 < 5,将5向右移动。
    [5, 5, 4, 6, 1, 3]  
        ↑  
        合适位置
    • 2插入:
    [2, 5, 4, 6, 1, 3]  
     ↑  
     已排序部分
  • 第2步(i=2,key=4):

    • 4 < 5,将5向右移动。
    [2, 5, 5, 6, 1, 3]  
             ↑  
             合适位置
    • 4插入:
    [2, 4, 5, 6, 1, 3]  
      ↑  
      已排序部分
  • 第3步(i=3,key=6):

    • 6大于5,直接插入:
    [2, 4, 5, 6, 1, 3]  
      ↑  
      已排序部分
  • 第4步(i=4,key=1):

    • 1 < 6542,逐一向右移动:
    [2, 4, 5, 6, 6, 3]  
    [2, 4, 5, 5, 6, 3]  
    [2, 4, 4, 5, 6, 3]  
    [2, 2, 4, 5, 6, 3]
    • 1插入:
    [1, 2, 4, 5, 6, 3]

  • 第5步(i=5,key=3):

    • 3 < 654,逐一向右移动:
    [1, 2, 4, 5, 6, 6]  
    [1, 2, 4, 5, 5, 6]  
    [1, 2, 4, 4, 5, 6]
    • 3插入:
    [1, 2, 3, 4, 5, 6]

完成

经过这些步骤,最终数组就被成功排序为 [1, 2, 3, 4, 5, 6]

总结

插入排序直观简单,适合于小规模数据的排序,尤其在数据接近有序时性能极好。尽管在大规模数据集上的效率较低,但由于其简单性和原地排序的特点,在一些场景中依然广泛使用。

更多学习内容,可关注公众号:CAD软件二次开发

以上内容为个人测试过程的记录,供大家参考。

内容如有错欢迎批评指正,谢谢!!!!

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值