package sort;
import java.util.Arrays;
/**
* @Author: weng
* @Date: 2022/4/22
* @Description: 快速排序(分治法)
*
* @see https://blog.csdn.net/shujuelin/article/details/82423852
*/
public class QuickSort {
private static int[] arr = {72,6,57,88,60,42,83,73,48,85};
/**
* <br/>function: 排序
* <br/>tip:
*
* @param: [arr, bgn, end]
* @return: int
* @author: weng
* @date: 2022/4/22 22:38
*/
private static void sort(int bgn,int end){
if(bgn > end){
return;
}
//初始的基准下标
int baseIdx_bfr = bgn;
//正确的基准下标
int baseIdx_afr;
//基准值
int baseVal = arr[baseIdx_bfr];
//游标
int idx_bgn = bgn;
int idx_end = end;
//找到正确的基准下标
while(true){
//两游标相遇的位置,即基准值的正确下标
if(idx_bgn >= idx_end){
baseIdx_afr = idx_bgn;
break;
}
//从右向左找小于基准值的元素
while(idx_bgn < idx_end && arr[baseIdx_bfr] <= arr[idx_end]){
idx_end --;
}
//从左向右找大于基准值的元素
while(idx_bgn < idx_end && arr[baseIdx_bfr] >= arr[idx_bgn]){
idx_bgn ++;
}
//大、小于值交换位置
if(idx_bgn < idx_end){
swap(idx_bgn,idx_end);
}
}
//将基准值置于正确的下标
arr[baseIdx_bfr] = arr[baseIdx_afr];
arr[baseIdx_afr] = baseVal;
//分治
sort(bgn,baseIdx_afr-1);
sort(baseIdx_afr + 1,end);
}
/**
* <br/>function: 数组元素交换
* <br/>tip:
*
* @param: [idx1, idx2]
* @return: void
* @author: weng
* @date: 2022/4/22 23:04
*/
private static void swap(int idx1,int idx2){
arr[idx1] ^= arr[idx2];
arr[idx2] ^= arr[idx1];
arr[idx1] ^= arr[idx2];
}
public static void main(String[] args) {
sort(0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
}
快速排序 随笔
于 2022-04-23 01:12:03 首次发布