算法面经--快速排序

作者: 永不熄灭的火焰_e306 | 来源:发表于2020-06-12 21:28 被阅读0次

    快速排序

    一、算法思路

    快速排序(Quicksort)是对冒泡排序的一种改进。

    基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排 序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    示意图:

    快速排序1.png 快速排序2.png

    [图片上传失败...(image-5b6176-1591968332129)]

    二、代码实现

     //调用传值
     quickSort(arr, 0, arr.length-1);
     ​
     public static void quickSort(int[] arr,int left,int right){
      int l = left;
      int r = right;
      //pivot
      int pivot = arr[(left + right)/2];
      int temp =0;
      while(l<r){
      //在pivot的左边一直找,找到大于等于pivot值,才退出
      while(arr[l]<pivot){
      l+=1;
      }
      //在pivot的右边一直找,找到小于等于pivot值,才退出
      while(arr[r]>pivot){
      r-=1;
      }
      //如果l >= r说明pivot 的左右两边的值,已经按照左边全部是
      //小于等于pivot值,右边全部是大于等于pivot值
      if(l>=r){
      break;
      }
      //交换
      temp = arr[l];
      arr[l] = arr[r];
      arr[r] = temp;
    
      //如果交换完后,发现这个arr[l] == pivot值,相等 r--,前移
      if(arr[l] == pivot){
      r-=1;
      }
      //如果交换完后,发现这个arr[r] == pivot值,相等 l--,后移
      if(arr[r] == pivot){
      l+=1;
      }
      }//while
      //如果l == r ,必须l++,r--,否则为出现栈溢出
      if(l == r){
      l+=1;
      r-=1;
      }
      //向左递归
      if(left <r){
      quickSort(arr,left,r);
      }
      //向右递归
      if(right >l){
      quickSort(arr,l,right);
      }
      }
     ​
    ####改良版本
    
    
     //另一种较为容易的实现思路  
     public static void quickSort2(int[] nums,int l,int r) {
      if(l>=r) return;
      int mid = (r+l)/2;
      int left = l;
      int right = r;
      while(l<r) {
      //直到比mid下标大于等于
      while(l<nums.length-1 && nums[l]<nums[mid]) l++;
      //直到比mid下标小于等于
      while(r>0 && nums[r]>nums[mid]) r--;
      //两个下标互换。这里之所以是l<=r是为了让l++和r--
      if(l<=r) {
      int temp = nums[l];
      nums[l] = nums[r];
      nums[r] = temp;
      l++;
      r--;
      }
      }
      //注意两个递归的起始位置。首先首尾是left-right没疑问
      //其次 l比r大1。这个差值是mid的位置。位置已经放对了不用管
      quickSort2(nums, left, r);
      quickSort2(nums, l, right);
      }
    

    相关文章

      网友评论

        本文标题:算法面经--快速排序

        本文链接:https://www.haomeiwen.com/subject/pkzntktx.html