[关闭]
@HUST-SuWB 2018-04-22T09:50:43.000000Z 字数 1468 阅读 354

啊哈算法读书笔记

Finlabtech


这部书作者是想用诙谐通俗的语言讲解算法,前半段可以说理解得特别流畅,确实看起来很轻松,但到了后半段,对于比较复杂的算法讲解能感觉到很吃力。这里我主要提一下我觉得以通俗的语言讲解得非常到位的快排[1]
总结一下快排:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
当然,描述起来很简单但是实现的话还是有一些需要注意的地方的。

  1. import java.util.stream.Collectors;
  2. import java.util.stream.Stream;
  3. /**
  4. * @author: tianxie
  5. * @Description: 快排,基于《啊哈算法》
  6. * 输入:6 1 2 7 9 3 4 5 10 8
  7. * 则递归过程为:
  8. * 6 1 2 5 9 3 4 7 10 8
  9. * 6 1 2 5 4 3 9 7 10 8
  10. * 3 1 2 5 4 6 9 7 10 8
  11. * 2 1 3 5 4 6 9 7 10 8
  12. * 1 2 3 5 4 6 9 7 10 8
  13. * 1 2 3 4 5 6 9 7 10 8
  14. * 1 2 3 4 5 6 9 7 8 10
  15. * 1 2 3 4 5 6 8 7 9 10
  16. * 1 2 3 4 5 6 7 8 9 10
  17. * @Date: 2018/3/28下午2:19
  18. */
  19. public class QuickSort {
  20. public static void main(String[] args) {
  21. Integer[] source = new Integer[]{91, 23, 12, 34, 7, 10, 23, 14, 64};
  22. String begin = Stream.of(source).map(Object::toString).collect(Collectors.joining(", "));
  23. quickSort(0, source.length-1, source);
  24. String end = Stream.of(source).map(Object::toString).collect(Collectors.joining(", "));
  25. System.out.println("排序前序列为: " + begin);
  26. System.out.println("排序后序列为: " + end);
  27. }
  28. private static void quickSort(int start, int end, Integer[] source) {
  29. //递归退出条件
  30. if(start >= end) {
  31. return;
  32. }
  33. //基准值默认取第一个
  34. int base = source[start];
  35. //分别从首尾开始迭代&交换
  36. int i = start;
  37. int j = end;
  38. while(i!=j) {
  39. while(i<j && source[j]>=base) {
  40. j--;
  41. }
  42. while(i<j && source[i]<=base) {
  43. i++;
  44. }
  45. if(i<j) {
  46. int temp = source[i];
  47. source[i] = source[j];
  48. source[j] = temp;
  49. }
  50. }
  51. //迭代完毕后更新基准值与i&j相会的index值
  52. source[start] = source[i];
  53. source[i] = base;
  54. //本次按照跟基准值的大小分割完毕,开始递归左右两个子序列
  55. quickSort(start, i-1, source);
  56. quickSort(j+1, source.length-1, source);
  57. }
  58. }

多提一句,从Java7开始,集合默认的排序底层实现由普通的快排变成了双中心快排,见:java.util.DualPivotQuicksort

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注