快排

  1. 确定分界点 q[l]
  2. 调整区间(左边区间的值小于分界点对应的值,右边区间的值大于分界点对应的值)
  3. 递归处理左右两段

    1. //快排模板
    2. private static void quickSort(Integer[] arr, int l, int r) {
    3. if (l >= r) return;
    4. //分界点
    5. int x = arr[l];
    6. //定义两个指针
    7. int i = l - 1;
    8. int j = r + 1;
    9. while (i < j) {
    10. //分区
    11. do i ++; while (arr[i] < x);
    12. do j --; while (arr[j] > x);
    13. if (i < j) swap(arr, i, j);
    14. }
    15. //递归处理左右两边
    16. quickSort(arr, l, j);
    17. quickSort(arr, j + 1, r);
    18. }

    归并排序

  4. 确定分界点:mid= (l + r) / 2

  5. 递归排序
  6. 归并-合二为一

    1. //归并排序模板
    2. private static void mergeSort(Integer[] q, int l, int r) {
    3. if (l >= r) return;
    4. //确定分界点
    5. int mid = l + r >> 1;
    6. int i = l;
    7. int j = mid + 1;
    8. int k = 0;
    9. //递归排序
    10. mergeSort(q, l, mid);
    11. mergeSort(q, mid + 1, r);
    12. //归并-合二为一
    13. while (i <= mid && j <= r)
    14. if (q[i] < q[j]) temp[k ++] = q[i ++];
    15. else temp[k ++] = q[j ++];
    16. while (i <= mid) temp[k ++] = q[i ++];
    17. while (j <= r) temp[k ++] = q[j ++];
    18. //赋值
    19. for (i = l, j = 0; i <= r; i ++, j ++) q[i] = temp[j];
    20. }