算法图解 第4章 快速排序

分而治之

  1. 使用分而治之解决问题的步骤:
  • 找出基线条件;
  • 将问题不断分解,直到符合基线条件;
  1. 设计数组的递归函数编写时,基线条件常是 数组为空只含一个元素

  2. 练习

  • 4.1 请编写前述sum函数的代码;

    public int sum(int[] arr){
      int result = 0;
      if(arr == null){
          return result;
      }else{
          for(int i = 0; i < arr.length; i++){
              result += arr[i];
          }
      }
      return result;
    }
    
  • 4.3 找出列表中最大的数字

      public int max(int[] arr){
          int max = arr[0];
          for(int item: arr){
              if(item > max){
                  max = item;
              }
          }
          return max;
      }
    

快速排序

  1. 思想:选定一个基准值pivot,然后将要排序的数组分为三部分(小于基准值的元素组成的子数组、基准值、大于基准值的元素组成的子数组),再对两个子数组进行排序,最后将他们和并,就得到了一个有序数组;

  2. 排序步骤:

  • 选择基准值;
  • 将数组分为两个子数组:小于基准值的元素和大于基准值的元素;
  • 对分出来的子数组进行快速排序;
  1. 实现

再谈大O标识符

  1. 练习用大O表示法表示下列操作所用时间:
  • 4.5 打印数组中每个元素的值

    假设数组长度为n,则时间效率为 O ( n ) O(n)

  • 4.6 将数组中每个元素的值都乘以2

    假设数组长度为n,则时间效率为 O ( n ) O(n) ,同上一题;

  • 4.7 只将数组中第一个元素的值乘以2

    因为只需要访问数组中第一个元素,所以不管数组长度,其时间效率为 O ( 1 ) O(1)

  • 4.8 根据数组包含的元素创建一个乘法表,即如果数组为[2, 3, 7, 8, 10],首先将每个元素都乘以2,再将每个元素都乘以3,然后将每个元素都乘以7,以此类推。

    进行了三次循环,但每次都是单独进行,所以时间效率为 O ( n ) O(n)

发布了138 篇原创文章 · 获赞 72 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/github_39655029/article/details/105448314
今日推荐