我想检查这是否是QuickSort的正确实现,它似乎正在完成这项工作,但我错过了什么吗?
public class QuickSort implements Sorter { public void sort(Comparable[] items) { QuickSort(items, 0, items.length - 1); } static void QuickSort(Comparable[] items, int a, int b) { int lo = a; int hi = b; if (lo >= hi) { return; } Comparable mid = items[(lo + hi) / 2]; Comparable T; while (lo < hi) { while (items[lo].compareTo(mid)<0) { lo++; } while (mid.compareTo(items[hi])<0) { hi--; } if (lo < hi) { T = items[lo]; items[lo] = items[hi]; items[hi] = T; } } QuickSort(items, a, lo); QuickSort(items, lo == a ? lo + 1 : lo, b); }
}
固定:
private static void quickSort(Comparable[] items, int a, int b) { int i = a; int j = b; Comparable x = items[(a+ b) / 2]; Comparable h; do { while (items[i].compareTo(x) < 0) { i++; } while (items[j].compareTo(x) > 0) { j--; } if (i <= j) { h = items[i]; items[i] = items[j]; items[j] = h; i++; j--; } } while (i <= j); if (a < j) { quickSort(items, a, j); } if (i < b) { quickSort(items, i, b); } }
RossFabrican.. 12
1小点 - 这里有一个潜在的int溢出:
(lo + hi)/ 2
1小点 - 这里有一个潜在的int溢出:
(lo + hi)/ 2
借此机会学习如何编写单元测试.(Google就"junit"而言).生成大型数组并确保它们正确排序,例如:填充随机数的数组,填充0,1,Integer.MAX_INT的数组.试着挑起整数溢出和其他奇怪的角落之类的东西.
编辑:我错过了java标签,对不起......以下是C#generic quickSort ...我会留在这里为.net读者...
乍一看看起来还不错,但这个通用的怎么样?
public class QuickSortwhere T : IComparable { #region private variable to sort inplace readonly private IList itms; #endregion private variable to sort inplace #region ctor private QuickSort() { } // Hide parameterless constructor /// /// Constructor requires IList /// ListT must implement CompareTo() method.../> /// of elements to sort public QuickSort(IList Lst):this)() { itms = Lst; } #endregion ctor #region public sort method public void Sort() { Sort(0, itms.Count - 1); } /// /// Executes QuickSort algorithm /// /// Index of left-hand boundary of partition to sort /// Index of right-hand boundary of partition to sort private void Sort(long L, long R) { // Calls iSort (insertion-sort) for partitions smaller than 5 elements if (R - L < 4) iSort(L, R); else { long i = (L + R) / 2, j = R - 1; // Next three lines to set upper and lower bounds if (itms[L].CompareTo(itms[i]) > 0) Swap(L, i); if (itms[L].CompareTo(itms[R]) > 0) Swap(L, R); if (itms[i].CompareTo(itms[R]) > 0) Swap(i, R); Swap(i, j); // -------------------------------- T p = itms[j]; // p = itms[j] is pivot element i = L; while (true) { while (itms[++i].CompareTo(p) < 0) {} while (itms[--j].CompareTo(p) > 0) {} if (j < i) break; Swap(i, j); } Swap(i, R - 1); Sort(L, i); // Sort Left partition -- HERE WAS TYPO BUG Sort(i + 1, R); // Sort Right partition } } #endregion public sort method #region private Helper methods private void Swap(long L, long R) { T t = itms[L]; itms[L] = itms[R]; itms[R] = t; } private void iSort(long L, long R) { for (long i = L; i <= R; i++) { T t = itms[i]; long j = i; while ((j > L) && (itms[j - 1].CompareTo(t) > 0)) { itms[j] = itms[j - 1]; j--; } itms[j] = t; } } #endregion private Helper methods }