package com.company.sort;
/***
* 功能描述
* 从序列中选出一个轴点元素,将序列分成两个子序列。大于轴点的放在右边,小于的放在左边
* 对自序列重复操作
* 快速排序的本质:将所有元素转换成轴点元素
* 轴点构造 先存储轴点元素 左右来回扫
*/
public class QuickSort {
public static void quickSort(int[] arr){
int length = arr.length;
sort(0,length,arr);
}
private static void sort(int begin,int end,int[] arr){
if (end - begin < 2) return;
int mid = pivot1(begin,end,arr);
sort(begin,mid,arr);
sort(mid+1,end,arr);
}
/*
* 构造出[begin,end)范围内的轴点元素的最终位置
* 轴点元素固定
*/
private static int pivot(int begin,int end,int[] arr){
//备份轴点元素
int pivot = arr[begin];
end--; //end指向最后一个元素 因为是[begin,end)
while (begin < end){
while (begin < end){
if (pivot < arr[end]){
end--;
}else {
arr[begin] = arr[end];
begin++;
break;
}
}
while (begin < end) {
if (pivot > arr[begin]) {
begin++;
} else {
arr[end] = arr[begin];
end--;
break;
}
}
}
//将轴点元素放到指定位置
arr[begin] = pivot;
return begin;
}
private static int pivot1(int begin,int end,int[] arr){
double randomIndex = Math.random() * (end - begin)+begin; //随机轴点元素
int tmp = arr[begin];
arr[begin] = arr[(int)randomIndex];
arr[(int)randomIndex] = tmp;
//备份轴点元素
int pivot = arr[begin];
end--; //end指向最后一个元素 因为是[begin,end)
while (begin < end){
while (begin < end){
if (pivot < arr[end]){
end--;
}else {
arr[begin] = arr[end];
begin++;
break;
}
}
while (begin < end) {
if (pivot > arr[begin]) {
begin++;
} else {
arr[end] = arr[begin];
end--;
break;
}
}
}
//将轴点元素放到指定位置
arr[begin] = pivot;
return begin;
}
public static void main(String[] args) {
int[] arr = {13,23,4,512,12,22,13,23,5566,4123,88787,4155};
quickSort(arr);
for (int i : arr) {
System.out.print(i+" ");
}
}
}
Java实现快速排序及其优化
最新推荐文章于 2023-09-10 15:14:16 发布