package io.github.chenshun00.web.sort;
import java.util.Arrays;
/**
* @author luobo.cs@raycloud.com
* @since 2021/8/12 7:09 下午
*/
public class QuickSort {
public static void main(String[] args) {
// int[] array = {1, 300, 29, 490, 961, 23, 47, 50, 234, 56, 23, 56, 678, 43, 672, 356, 35, 2, 994, 67, 98, 9, 345, 76, 345, 234, 4, 2, 645, 6, 235, 3, 563};
int[] array = {100, 9, 190, 361, 2, 7, 5};
sort(array);
System.out.println(Arrays.toString(array));
}
public static void sort(int[] sourceArray) {
quickSort(sourceArray, 0, sourceArray.length - 1);
}
private static void quickSort(int[] arr, int left, int right) {
if (right > left) {
//找到临界点
int lingJieDian = find(arr, left, right);
quickSort(arr, left, lingJieDian - 1);
quickSort(arr, lingJieDian + 1, right);
}
}
/**
* 目标: 找到中间点
* <p>
* 1、明确开始位置(begin)、结束位置(end)、以及开始(start)的标杆数值
* <code>
* 1、从开始位置+1开始处理,如果比开始大,就从后开始找比开始位置小的,然后交换. 开始位置+1,后置位置-1。
* 2、开始位置碰到结束位置的时候,就结束了
* </code>
*
* @param arr 待排序数组
* @param left 排序开始位置
* @param right 排序结束位置
* @return 中间点
* int[] array = {100, 9, 190, 361, 2, 7, 5};
* // 100 9 5 7 2 361 190
*/
private static int find(int[] arr, int left, int right) {
int end = right;
int start = arr[left];
//从开始位置找到结尾
for (int i = left; i <= end; i++) {
//当前位置值
final int currentStart = arr[i];
//如果大于基点位置
if (currentStart > start) {
//从后往前找
for (int r = end; r >= i; r--) {
//后边的值
final int currentEnd = arr[r];
//后边的值小于基点
if (currentEnd < start) {
//交换
swap(arr, i, r);
//向后走一下 && 继续从前往后走
end--;
break;
} else {
//继续向后走
end--;
}
}
}
}
//这里是核心,交换基点位置. 基点左边的都小于基点 & 基点右边的都大于基点
swap(arr, left, end);
return end;
}
/**
* 交换
*
* @param array 数组
* @param a 低位
* @param b 高位
*/
public static void swap(int[] array, int a, int b) {
int temp = array[a];
array[a] = array[b];
array[b] = temp;
}
}