private static int Partation <T>(ListSlice <T> list) where T : System.IComparable <T>, System.IComparable { int left = 0, right = list.Count - 2; T pivot = list[right + 1]; while (left < right) { if (list[left].CompareTo(pivot) < 0) { left++; continue; } if (list[right].CompareTo(pivot) > 0) { right--; continue; } list.Swap(left, right); left++; right--; } int mid = list[right].CompareTo(pivot) > 0 ? right : right + 1; list.Swap(mid, list.Count - 1); return(mid); }
public static void HeapSort <T>(ListSlice <T> list) where T : System.IComparable <T>, System.IComparable { for (int i = list.Count / 2 - 1; i >= 0; i--) { heapify(list, i); } for (int i = list.Count - 1; i >= 0; i--) { list.Swap(0, i); heapify(list.GetSlice(0, i), 0); } }
public static void SelectionSort <T>(ListSlice <T> list) where T : System.IComparable, System.IComparable <T> { for (int i = 1; i < list.Count; i++) { for (int j = i - 1; j >= 0; j--) { if (list[j + 1].CompareTo(list[j]) < 0) { list.Swap(j + 1, j); } else { continue; } } } }
public static void ShellSort <T>(ListSlice <T> list, int step) where T : System.IComparable, System.IComparable <T> { if (step > 0) { for (int i = 0; i < list.Count - step; i++) { if (list[i].CompareTo(list[i + step]) > 0) { list.Swap(i, i + step); } } ShellSort(list, step / 2); } else { InsertionSort(list); } }
private static void heapify <T>(ListSlice <T> list, int i) where T : System.IComparable <T>, System.IComparable { int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l < list.Count && list[l].CompareTo(list[largest]) > 0) { largest = l; } if (r < list.Count && list[r].CompareTo(list[largest]) > 0) { largest = r; } if (largest != i) { list.Swap(i, largest); heapify(list, largest); } }
public static void CombSort <T>(ListSlice <T> list) where T : System.IComparable <T>, System.IComparable { int gap = list.Count; bool sorted = false; while (!sorted) { if (gap < 1) { sorted = true; gap = 1; } for (int i = 0; i < list.Count - gap; i++) { if (list[i].CompareTo(list[i + gap]) > 0) { list.Swap(i, i + gap); sorted = false; } } gap = (int)(gap / 1.3f); } }