插入在C#中的字符串数组上排序

如果我有一个字符串数组,例如

string[] names = {"John Doe", "Doe John", "Another Name", "Name Another"}; 

如何使用插入排序对此数组进行排序?

维基百科有一些例子: https : //en.wikibooks.org/wiki/Algorithm_implementation/Sorting/Insertion_sort#C.23

 static void InsertSort(IComparable[] array) { int i, j; for (i = 1; i = 0) && (array[j].CompareTo(value) > 0)) { array[j + 1] = array[j]; j--; } array[j + 1] = value; } } 

 static void InsertSort(IList list) where T : IComparable { int i, j; for (i = 1; i = 0) && (list[j].CompareTo(value) > 0)) { list[j + 1] = list[j]; j--; } list[j + 1] = value; } } 

但它似乎不适用于我的字符串数组,除非我做错了什么。

我不会跑

 InsertSort(names); // like so? 

适合我的工作:

 class Program { static void Main() { string[] names = { "John Doe", "Doe John", "Another Name", "Name Another" }; InsertSort(names); foreach (var item in names) { Console.WriteLine(item); } } static void InsertSort(IComparable[] array) { int i, j; for (i = 1; i < array.Length; i++) { IComparable value = array[i]; j = i - 1; while ((j >= 0) && (array[j].CompareTo(value) > 0)) { array[j + 1] = array[j]; j--; } array[j + 1] = value; } } } 

正如所料,它打印:

 Another Name Doe John John Doe Name Another 

这是我的实现:

 public static void Swap(ref T a, ref T b) { T t = a; a = b; b = t; } public static void InsertionSort(this T[] a) where T : IComparable { a.InsertionSort(Comparer.Default.Compare); } public static void InsertionSort(this T[] a, Comparison c) { int n = a.Length; for (int i = 1; i < n; ++i) for (int k = i; k > 0 && c(a[k], a[k - 1]) < 0; --k) Swap(ref a[k], ref a[k - 1]); } 

我做了一些课来做到这一点:

 public static class InsertionSort where T : System.IComparable { public static void Sort(ref T[] array) { T[] tmp = new T[array.Length]; tmp[0] = array[0]; for (int i = 1; i < array.Length; i++) { int place = FindProperPlace(tmp, array[i]); ExpandArray(ref tmp, place); tmp[place] = array[i]; } array = tmp; } private static int FindProperPlace(T[] numbersArray, T number) { int j; for (j = 0; j < numbersArray.Length; j++) { if (number.CompareTo(numbersArray[j]) < 0) { break; } } return j; } private static void ExpandArray(ref T[] tmp, int place) { for (int i = tmp.Length - 1; i > place; i--) { tmp[i] = tmp[i - 1]; } } }