Java快速排序算法,快排算法,快排!
Talking is cheap Show me code
废话不多说、直接上代码,不会用?CV就好啦!
package meta.java.algo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
public class QuickSort {
private static final Logger logger = LoggerFactory.getLogger(QuickSort.class);
public static void main(String[] args) {
int[] arr = ArrT.arr;
logger.info("排序前:");
logger.info(Arrays.toString(arr));
standQuickSort(arr);
//standQuickSortLeft(arr);
//standQuickSortRight(arr);
logger.info("排序后:");
logger.info(Arrays.toString(arr));
}
public static void standQuickSort(int[] arr){
standQuickSort(arr,0, arr.length-1);
}
private static void standQuickSort(int[] arr, int head, int tail) {
if (head >= tail) return;
int tempIndex = (int) (System.currentTimeMillis() % (tail - head + 1) + head);
int key = arr[tempIndex], leftTemp = head, rightTemp = tail;
for (; leftTemp < rightTemp && arr[leftTemp] < key; leftTemp++) {
}//先处理一次,防止左值或右值丢失而造成重复,这里先预处理了左边,因为常规循环中是先处理的右边不能与之相同
arr[tempIndex] = arr[leftTemp];
while (leftTemp < rightTemp) {
while (leftTemp < rightTemp && arr[rightTemp] > key) rightTemp--;
if (leftTemp < rightTemp) {
arr[leftTemp] = arr[rightTemp];
leftTemp++;
}
while (leftTemp < rightTemp && arr[leftTemp] < key) leftTemp++;
if (leftTemp < rightTemp) {
arr[rightTemp] = arr[leftTemp];
rightTemp--;
}
}
arr[leftTemp] = key;
standQuickSort(arr, head, leftTemp - 1);
standQuickSort(arr, rightTemp + 1, tail);
}
public static void standQuickSortLeft(int[] arr){
standQuickSortLeft(arr,0, arr.length-1);
}
private static void standQuickSortLeft(int[] arr, int head, int tail) {
if (head >= tail) return;
int key = arr[head], leftTemp = head, rightTemp = tail;
while (leftTemp < rightTemp) {
while (leftTemp < rightTemp && arr[rightTemp] > key) rightTemp--;
if (leftTemp < rightTemp) {
arr[leftTemp] = arr[rightTemp];
leftTemp++;
}
while (leftTemp < rightTemp && arr[leftTemp] < key) leftTemp++;
if (leftTemp < rightTemp) {
arr[rightTemp] = arr[leftTemp];
rightTemp--;
}
}
arr[leftTemp] = key;
standQuickSortLeft(arr, head, leftTemp - 1);
standQuickSortLeft(arr, rightTemp + 1, tail);
}
public static void standQuickSortRight(int[] arr){
standQuickSortRight(arr,0, arr.length-1);
}
private static void standQuickSortRight(int[] arr, int head, int tail) {
if (head >= tail) return;
int key = arr[tail], leftTemp = head, rightTemp = tail;
while (leftTemp < rightTemp) {
while (leftTemp < rightTemp && arr[leftTemp] < key) leftTemp++;
if (leftTemp < rightTemp) {
arr[rightTemp] = arr[leftTemp];
rightTemp--;
}
while (leftTemp < rightTemp && arr[rightTemp] > key) rightTemp--;
if (leftTemp < rightTemp) {
arr[leftTemp] = arr[rightTemp];
leftTemp++;
}
}
arr[leftTemp] = key;
standQuickSortRight(arr, head, leftTemp - 1);
standQuickSortRight(arr, rightTemp + 1, tail);
}
}
反复测试了几遍,应该没有BUG,嘻嘻😊