快速排序:找到基准数据(可以为第一个,也可以为最后一个,也可以为中的数据)在数组的起始位置(左)与数组末尾(右)分别遍历数据与基准位置的数据进行比较;一般将比基准数据大的数据放到数组右边 ,小的放左边,然后对修改后的数据,分别对左半部分和右半部分采用相同的方式进行递归
package Sort;
import java.util.Arrays;
/**
* @author lxy
* @version 1.0
* @date 2020/10/8 20:01
* 测试快速排序
*/
public class QuickSort{
public static void main(String[] args) {
int[] arr = new int[]{8,1,4,0,5,2,-1,-7,6};
sort(arr,0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr , int left ,int right){
int p = arr[(right+left)/2];
int l = left;
int r = right;
while(l<r){
//在左面选取比中间的值大的值
while (arr[l]<p){
l+=1;
}
//在右面选取比中间的值小的值
while (arr[r]>p){
r-=1;
}
//左边与右边的值进行交换
int temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
if (l>=r){
break;
}
//交换完后如果左边的数等于中间的数;只需要对右边的减一
if (arr[l] == p){
r-=1;
}
//交换完后如果右边的数等于中间的数;只需要对左边的+1
if (arr[r] == p){
l+=1;
}
}
//防止递归时栈溢出
if (l == r) {
l=l+1;
r-=1;
}
//左边的下标小于右边;对左边部分进行递归排序
if (left<r){
sort(arr,left,r);
}
//右边的下标大于左边;对右边部分进行递归排序
if (left<r){
sort(arr,l,right);
}
}
}
优化
package Review;
import java.util.Arrays;
/**
* @author lxy
* @version 2.0
* @date 2020/10/17 21:31
* 复习快速排序
*/
public class QuickSort {
public static void main(String[] args) {
int[] arr = new int[]{0,2,3,1,6,4,5,9,7,8};
sort(arr,0, arr.length-1);
System.out.println("----"+Arrays.toString(arr));
}
public static void sort(int[] arr,int left,int right){
int l =left;
int r = right;
int temp = arr[(left+right)/2];
while (l<r){
while(arr[l]<temp){
l+=1;
}
while(arr[r]>temp){
r-=1;
}
int Temp = arr[l];
arr[l] = arr[r];
arr[r] = Temp;
if (l>=r){
break;
}
if (arr[l] == temp){
r-=1;
}
if (arr[r] == temp){
l+=1;
}
sort(arr,left,r);
sort(arr,l,right);
}
}
}