java算法及数据结构and面经

算法面经--快速排序

2020-06-12  本文已影响0人  永不熄灭的火焰_e306

快速排序

一、算法思路

快速排序(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);
  }
上一篇下一篇

猜你喜欢

热点阅读