概念

分治,将较大规模的问题分解成几个较小规模的问题。
例子:猜数字游戏,从几楼扔下手机不会摔坏,查找C盘中最大的文件,黄页电话簿,翻字典。

快速排序(先找分界点再递归)

  1. // 学习目标:理解好分治的过程,讲解理论用处多,实际应用比较少
  2. void quick_sort(int q[], int l, int r)
  3. {
  4. if (l >= r) return;
  5. int i = l - 1, j = r + 1, x = q[l + r >> 1];
  6. while (i < j)
  7. {
  8. do i ++ ; while (q[i] < x);
  9. do j -- ; while (q[j] > x);
  10. if (i < j) swap(q[i], q[j]);
  11. }
  12. quick_sort(q, l, j), quick_sort(q, j + 1, r);
  13. }

例题:输出前k大的数

归并排序(先递归再合并)

  1. // 学习目标:理解过程,实际应用会灵活多变
  2. void merge_sort(int q[], int l, int r)
  3. {
  4. if (l >= r) return;
  5. int mid = l + r >> 1;
  6. merge_sort(q, l, mid);
  7. merge_sort(q, mid + 1, r);
  8. int k = 0, i = l, j = mid + 1;
  9. while (i <= mid && j <= r)
  10. if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
  11. else tmp[k ++ ] = q[j ++ ];
  12. while (i <= mid) tmp[k ++ ] = q[i ++ ];
  13. while (j <= r) tmp[k ++ ] = q[j ++ ];
  14. for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
  15. }

例题:【例7.7】光荣的梦想