要点
基本思想:就是把一个新的元素插入已排好序的数组形成一个新的已排好序的数组(比方说:有一个数组是 1,3,4,6,8 现在要将“2”插入到数组中,那么插入位置就是“1”和“3”之间,形成一个新的有序数组),就好像打扑克牌一样,比如先拿一张5在手里,再摸到一张4,比5小,插到5前面,摸到一张7,嗯,比5大,插到5后面,摸到一张8,比7大,插到7后面,就这样。。。
实现思路:从第一个元素开始,取下一个元素比较后实现排序,形成新的数组,再取第三个元素与该数组比较,比较时从该数组的最后一位开始比较,若新元素比与其比较的元素小,则将该比较的元素后移以为,直到新元素比该数组左边找到其应该插入的位置。
图解往往会更好,我下边这张图很清楚,很容易看懂,顺便说一下个人理解!
上边图中,通过直接插入排序,将无序数列变为从小到大有序数列!原先数列为:3,44,38,5,47,15,36,26,27,2,46,4,19,50,48
第一步:先将第一个元素“3”看作是一个有序数列
第二步:将原先被看作为有序数列的“3”的后一位元素抽出,与原先有序数列进行比对(图中先把“3”作为一个有序数列,然后将后边的“44”抽出,与其比较,原先有序数列中的元素如果比抽出的元素小,则不变,如果比抽出的元素大,则将原先数列中比较的元素向后移动,“3”比“44”小 不变)
第三步:依照第二步步骤,继续向后移动,这时新的有序数列从原先的“3”变为了“3,44”,继续向后移动,将“38”抽出,与有序数列进行比较,从后向前,先与“44”比较,比抽出的元素大,所以向后移动位置,然后再与有序数列的中“3”进行比较,比抽出的数列小,不变,所以就将抽出的元素“38”归位,放到已经向后移动过的元素“44”的位置。
第四步:接下来的过程就依照上述步骤,不停的向后移动,不停的将抽出的元素与新组成的有序数列进行比对,原先有序数列中的元素如果比抽出的元素小就不变,大就向后移动,直到排序完成结束!
代码(C#版本)
class Program { static void Main(string[] args) { int[] arr = { 10, 25, 15, 8, 65, 35, 48, 95, 78, 13 }; InsertSort(arr); for (int i = 0; i < arr.Length; i++) { Console.WriteLine(arr[i]); } Console.ReadKey(); } /// <summary> /// 直接插入排序 /// </summary> /// <param name="array">需要排序的数组</param> public static void InsertSort(int[] array) { //循环遍历数组,从第二个元素开始 for (int i = 1; i < array.Length; i++) { //将第二个元素拿出 int temp = array[i]; for (int j = i - 1; j >= 0; j--) { //原先有序数列如果比抽出的元素大 if (array[j] > temp) { //则向后移动位置 array[j + 1] = array[j]; array[j] = temp; } else break; } } } }
学习完成!(*^▽^*)