熟真的能生巧啊!第一次接触到插入排序法的时候,我只能明白老师讲的过程,但是老师一走我瞬间就不会了,说到底还是没有掌握本质,结果把老师也气的无语啦!但是经过反复写反复看,才终于明白插入排序的精髓所在,到头来发现其实也蛮简单的呀!
插入排序法对于一个初学者应该有如下的思路,首先是单次插入,假设所给的集合是一个有序集合,现在需要将一个数插入到这个有序集合中去,我们将这个数记为目标数,首先需要得到的是集合中第一个比目标数大的元素的位置(这个位置就是目标数应该去的位置),然后从这个位置(包含这个位置)开始将以后的所有数从后开始向后移一位,再把目标数放入之前第一个比目标数大的元素的位置,这样我们就得到了一个将目标数插入集合后仍然有序的集合;如果遍历整个数组都没有找到一个比目标数大的数,那么一定意味着目标数是最大的数,将目标数放入最后被一个位置。其次上述步骤完成后,再进行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的姑娘!