插入排序
插入排序使用了两层嵌套循环,逐个处理待排序的记录。每个记录与前面已经排好序的记录序列进行比较,并将其插入到合适的位置。假设数组长度为n,外层循环控制变量i由1至n-1依次递进,用于选择当前处理哪条记录;里层循环控制变量j,初始值为i,并由i至1递减,与上一记录进行对比,决定将该元素插入到哪一个位置。这里的关键思想是,当处理第i条记录时,前面i-1条记录已经是有序的了。需要注意的是,因为是将当前记录与相邻的上一记录相比较,所以循环控制变量的起始值为1(数组下标),如果为0的话,上一记录为-1,则数组越界。 现在我们考察一下第i条记录的处理情况:假设外层循环递进到第i条记录,设其关键码的值为X,那么此时有可能有两种情况: 如果上一记录比X大,那么就交换它们,直到上一记录的关键码比X小或者相等为止。 如果上一记录比X小或者相等,那么之前的所有记录一定是有序的,且都比X小,此时退出里层循环。外层循环向前递进,处理下一条记录。
1 pulic class void InsertSort<T,C>(T[] array,C comparer)where C:Icomparer<T> 2 { 3 for(int i=1;i<=array.length;i++) 4 { 5 j=i; 6 while(j>=1&&comparer.Compare(array[j],array[j-1])<0) 7 { 8 swap(ref array[j],array[j-1]); 9 j--; 10 } 11 AlgorithmHelper.PrintArray(array); 12 } 13 } 14 15 // 交换数组array中第i个元素和第j个元素 16 public static void swap(T)(ref T x,ref T y) 17 { 18 T temp=x; 19 x=y; 20 y=temp; 21 } 22 23 public class AlgorithmHelper { 24 // 打印数组内容 25 public static void PrintArray<T>(T[] array) { 26 Console.Write(" Array:"); 27 foreach (T item in array) { 28 Console.Write(" {0}", item); 29 } 30 Console.WriteLine(); 31 } 32 } 33 34 // 获得Comparer,进行比较 35 public class ComparerFactory { 36 public static IComparer<int> GetIntComparer() { 37 return new IntComparer(); 38 } 39 40 public class IntComparer : IComparer<int> { 41 public int Compare(int x, int y) { 42 return x.CompareTo(y); 43 } 44 } 45 }