算法面经--快速排序
2020-06-12 本文已影响0人
永不熄灭的火焰_e306
快速排序
一、算法思路
快速排序(Quicksort)是对冒泡排序的一种改进。
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排 序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
示意图:
![](https://img.haomeiwen.com/i18653827/8d09044c1f28b20f.png)
![](https://img.haomeiwen.com/i18653827/675f0f65abb11d7b.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);
}