真的能生巧啊!第一次接触到插入排序法的时候,我只能明白老师讲的过程,但是老师一走我瞬间就不会了,说到底还是没有掌握本质,结果把老师也气的无语啦!但是经过反复写反复看,才终于明白插入排序的精髓所在,到头来发现其实也蛮简单的呀!

插入排序法对于一个初学者应该有如下的思路,首先是单次插入,假设所给的集合是一个有序集合,现在需要将一个数插入到这个有序集合中去,我们将这个数记为目标数,首先需要得到的是集合中第一个比目标数大的元素的位置(这个位置就是目标数应该去的位置),然后从这个位置(包含这个位置)开始将以后的所有数从后开始向后移一位,再把目标数放入之前第一个比目标数大的元素的位置,这样我们就得到了一个将目标数插入集合后仍然有序的集合;如果遍历整个数组都没有找到一个比目标数大的数,那么一定意味着目标数是最大的数,将目标数放入最后被一个位置。其次上述步骤完成后,再进行n次循环就可以将一个无序数组变得有序。

下面我以一个实例向大家展示整个过程:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace prj插入排序法{    class Program    {        static void Main(string[] args)        {            //准备一个至少有两个元素的无序的集合            int[] ary = new int[] { 27, 12, 16, 66, 45, 0, 13 };            //经过数组长度-1次循环将无序数组变得有序            for (int j = 0; j < ary.Length - 1; j++)            {                //准备一个目标来存放当前数组的下一位                int target = ary[j + 1];                //定义一个索引来存放当前数组中第一个比目标大的数的位置                //索引值为-1表示当前数组中没有比目标大的数                int index = -1;                //遍历当前的整个数组(最后一位为空,不用考虑)寻找第一个比目标                //大的数的位置,并将其位置赋给index,然后立刻结束循环                for (int i = 0; i < j + 1; i++)                {                    if (ary[i] > target)                    {                        index = i;                        break;                    }                }                //如果找到了,将index(包含index)后的数从后开始依次后移一位                //并将目标值放入索引为index的位置上                if (index != -1)                {                    for (int i = j; i >= index ; i--)                    {                        ary[i + 1] = ary[i];                    }                    ary[index] = target;                }                //若是没有找到,那么一定意味着目标数最大的数,将目标值放入当前数组的最后一位                else                {                    ary[j + 1] = target;                }            }            //打印出最终的有序数组            foreach (int x in ary)            {                Console.WriteLine(x);            }        }    }}

运行结果如下:

不论什么都应该多多练习,方可熟练掌握!

加油!Ajax的姑娘!