package com.company;
import java.util.Arrays;
/**
* @author longlyboyhe
* @date on 2020/6/19 15:18
* @filename QuickSort.java
* @description 快速排序
*/
public class QuickSort {
public static void main(String[] args) {
QuickSort quickSort = new QuickSort();
quickSort.quickSort(new int[]{5, 49, 38, 65, 97, 76, 13, 27, 49});
}
public void quickSort(int[] arr) {
System.out.println("快速排序");
if (arr == null || arr.length == 0) {
return;
}
//quickSort(arr, 3, arr.length-1);
quickSort2(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
private void quickSort(int[] arr, int low, int high) {
if (low < high) {
System.out.println(Arrays.toString(arr));
int index = getIndex(arr, low, high);
quickSort(arr, 0, index - 1);
quickSort(arr, index + 1, high);
}
}
private int getIndex(int[] arr, int low, int high) {
int temp = arr[low];
while (low < high) {
// 当队尾的元素大于等于基准数据时,向前挪动high指针
while (low < high && arr[high] >= temp) {
//大的值不用动,high往前移
high--;
}
// 如果队尾元素小于tmp了,需要将其赋值给low
arr[low] = arr[high];
// 当队首元素小于等于tmp时,向前挪动low指针
while (low < high && arr[low] <= temp) {
low++;
}
// 当队首元素大于tmp时,需要将其赋值给high
arr[high] = arr[low];
}
// 跳出循环时low和high相等,此时的low或high就是tmp的正确索引位置
// 由原理部分可以很清楚的知道low位置的值并不是tmp,所以需要将tmp赋值给arr[low]
arr[low] = temp;
return low;
}
private void quickSort2(int[] a,int l,int r){
if(l<r){
int index=findIndex(a,l,r);
quickSort2(a,0,index-1);
quickSort2(a,index+1,r);
}
}
private int findIndex(int[] a, int l, int r) {
int tmp=a[l];
while (l<r){
while (l<r&&a[r]>=tmp){
r--;
}
a[l]=a[r];
while (l<r&&a[l]<=tmp){
l++;
}
a[r]=a[l];
}
a[l]=tmp;
return l;
}
}
运行结果: