插入在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]; } } }