快速排序
package com.haoran.learn.sort;
import java.time.LocalDateTime;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
//八百万的随机数
int[] arr = new int[8000000];
for (int i = 0; i < 8000000; i++) {
arr[i] = (int)(Math.random()*80000000);
}
LocalDateTime now = LocalDateTime.now();
System.out.println("排序前:"+now);
quickSort(arr, 0, arr.length - 1);
LocalDateTime now1 = LocalDateTime.now();
System.out.println("排序后:"+now1);
}
public static void quickSort(int[] arr, int left, int right) {
//定义下标
int l = left;
int r = right;
//找到中位数
int midNum = arr[(left + right) / 2];
//临时变量
int temp = 0;
//while循环,目的是让比midNum小的数放左边,比midNum大的数放右边
while (l < r) {
//从左边一直找,直到大于midNum就退出
while (arr[l] < midNum) {
l += 1;
}
//从右边一直找,直到找到小于midNum退出
while (arr[r] > midNum) {
r -= 1;
}
//如果左下标大于右下标了,说明midNum左边全是小于等于它的数,右边全是大于等于它的数
if (l >= r) {
break;
}
//交换
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
//如果交换完后,arr[l]与midNum相等, 则r 需要--,前移
if (arr[l] == midNum) {
r -= 1;
}
//如果交换完后,arr[r]与midNum相等, 则l 需要++,后移
if (arr[r] == midNum) {
l += 1;
}
}
//如果l == r,需要l += 1; r -= 1; 否则栈溢出
if (l == r) {
l += 1;
r -= 1;
}
if (left<r){
quickSort(arr,left,r);
}
if(right>l){
quickSort(arr,l,right);
}
}
}
输出结果:
排序前:2020-09-14T12:16:04.285
排序后:2020-09-14T12:16:05.347