最好、平均时间复杂度:O(nlogn)
    最坏时间复杂度:O(n2)
    由于递归调用的缘故,空间复杂度:O(logn)

    1. @Override
    2. protected void sort() {
    3. sort(0, array.length);
    4. }
    5. /**
    6. * 对 [begin, end) 范围内的元素进行快速排序
    7. */
    8. private void sort(int begin, int end) {
    9. if (end - begin < 2) {
    10. return;
    11. }
    12. //确定轴点位置
    13. int mid = pivotIndex(begin, end);
    14. //对子序列继续快排
    15. sort(begin, mid);
    16. sort(mid + 1, end);
    17. }
    18. /**
    19. * 确定 [begin, end) 范围的轴点索引index
    20. * @return 返回轴点的索引
    21. */
    22. private int pivotIndex(int begin, int end) {
    23. // 备份begin的元素--选取轴点
    24. T pivot = array[begin];
    25. end--;
    26. while (begin < end) {
    27. while (begin <end) {
    28. if (cmp(pivot, array[end]) < 0) {
    29. end--;
    30. } else {
    31. //则end位置的元素小于或等于轴点
    32. array[begin] = array[end];
    33. begin++;
    34. break;
    35. }
    36. }
    37. while (begin <end) {
    38. if (cmp(pivot, array[begin]) > 0) {
    39. begin++;
    40. }else {
    41. array[end] = array[begin];
    42. end--;
    43. break;
    44. }
    45. }
    46. }
    47. //来到这儿说明begin==end
    48. // 将轴点元素放入最终位置,返回轴点元素索引
    49. array[begin] = pivot;
    50. return begin;
    51. }