package com.example.demo.controller;
import com.google.common.primitives.Ints;
public class StudyQuickSort {
/**
* 把基准元素放在中间
* @param arr
* @param start
* @param end
* @return
*/
public static int partition (int[] arr,int start,int end) {
int base = arr[end];
while (start < end) {
//1.向右移动找到比基准的大的,进行交换位置
while (start < end && arr[start] <= base) {
start++;
}
//1.1.跳出循环证明向右移动找到比基准的大的
//1.2.交换位置
if (start < end) {
int temp = arr[start];
arr[start] = arr[end];
arr[end]= temp;
//1.3.之所以end--是因为被调换的元素(比基准大的元素)已经在基准元素的右边了
end--;
}
//2.向左移动找出比基准小的,进行交换位置
while (start < end && arr[end] >= base) {
end--;
}
//2.1.跳出循环证明向左移动找到比基准的小的
//2.2.交换位置
if (start < end) {
int temp = arr[start];
arr[start] = arr[end];
arr[end]= temp;
//2.3.之所以start++是因为被调换的元素(比基准小的元素)已经在基准元素的左边了
start++;
}
}
//3.其实到这一步end = start了,所以返回end或者start都可以
return end;
}
/**排序
* @param arr
* @param start
* @param end
*/
public static void quickSort (int[] arr,int start,int end) {
if (arr == null || start < 0 || end < 0 || start == end || start > end ) {
return;
}else {
int patition = partition(arr,start,end);
quickSort(arr,start,patition-1);
quickSort(arr,patition+1,end);
}
}
public static void main (String[] args) {
int[] arr = {1,10,2,9,3,2,4,7,5,6};
quickSort(arr,0,arr.length-1);
Ints.asList(arr).stream().forEach(a -> System.out.println(a));
}
}