C#直接插入排序

直接插入排序,就像上体育课时,比个头排纵队,矮的同学向前走,一直走到比他矮的。只不过咱们数据结构的直接插入排序,需要比对的值是从数组第二个位置开始的,一直循环到整个数组。现实中排队,是很多同学一起,排队,再检索。


这里有张插入排序的图,可以好好捋捋思维。注意数组索引,下面的代码,循环的边界问题才能清除。多想几遍,注意数组索引是从0开始的。数组的长度是数组最后一个数据索引+1。


下面是代码部分:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _006_直接插入排序
{
    class Program
    {
        static void InsertSort(int[] dataArray)
        {
            
            for (int i = 1; i < dataArray.Length; i++) //从数组拿第二个值dataArray[1]和dataArray[0]比较大小,循环至整个数组排好序
            {
                bool isInsert = false;              //标志,判断是否插过了
                int iValue = dataArray[i];          //保存当前需要比对的值dataArray[i] 为 iValue,防止移动数据时被覆盖
                for (int j = i - 1; j >= 0; j--)    // 将dataArray[i]和它前面的的所有值作比较
                {
                    if(dataArray[j] > iValue)       //如果 当前遍历位置的值 dataArray[j] > iValue
                    {
                        dataArray[j + 1] = dataArray[j]; //就把 当前遍历位置的值 dataArray[j] 向后移动一位
                    }
                    else                            //如果 当前遍历位置的值 dataArray[j] < iValue
                    {
                        dataArray[j + 1] = iValue;  //就把 iValue 放到 dataArray[j] 后面 即 dataArray[j + 1]位置
                        isInsert = true;
                        break;                      //一定要记得加break,否则,会插很多次,值会覆盖混乱
                    }
                }
                if (!isInsert)                      //经过循环,标志false显示未被插入,证明iValue是比它前面的值都小,故将其放入数组0号位置
                {
                    dataArray[0] = iValue;
                }
            }
        }
        static void Main(string[] args)
        {
            int[] dataArray = new int[] { 1, 5, 3, 2, 7, 9, 4, 6, 8};
            InsertSort(dataArray);
            foreach(var temp in dataArray)
            {
                Console.WriteLine(temp);
            }
            Console.ReadKey();
        }
    }

运行结果截图:


猜你喜欢

转载自blog.csdn.net/qq_39225721/article/details/80117172