快速排序方法:
public static void quickSort(int[] arr, int left, int right) {
int l = left;//左下标
int r = right;//右下标
//pivot 中轴值
int pivot = arr[(left + right) / 2];
int temp = 0;//临时变量 作为交换时使用
//while 循环的目的是让比pivot 值小放到左边
//比pivot 值大放到右边
while (l < r) {
//在pivot 的左边一直找,找到大于等于pivot值,才退出
while (arr[l] < pivot) {
l += 1;
}
//在pivot 的右边一直找,找到小于等于pivot值,才退出
while (arr[r] > pivot) {
r -= 1;
}
//如果l >= r说明pivot 的左右两的值,已经安装左边全部是
//小于等于pivot值,右边全部大于等于pivot值
if (l >= r) {
break;
}
//交换
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
//如果交换完成后,发现这个arr[l] == pivot值 相等就减减,前移
if (arr[l] == pivot) {
r -= 1;
}
//如果交换完后,发现这个arr[r] == pivot 相等 l加加,后移
if (arr[r] == pivot) {
l += 1;
}
}
//如果 f == t ,必须f++,t--,否则为出现栈溢出
if (l == r) {
l += 1;
r -= 1;
}
//向左递归
if (left < r) {
quickSort(arr, left, r);
}
//向右递归
if (right>l){
quickSort(arr,l,right);
}
}
main方法及800w随机数运行时间测试,相较之其他排序,快速排序的运行还是比较快的。
public static void main(String[] args) {
int[] arr = new int[8000000];
for (int i = 0; i < 8000000; i++) {
arr[i] = (int) (Math.random() * 8000000);//生成一个[0,8000000) 随机数
}
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = simpleDateFormat.format(date);
System.out.println("排序前的时间是=" + dateStr);
quickSort(arr,0,arr.length-1);
Date date1 = new Date();
String dateStr1 = simpleDateFormat.format(date1);
System.out.println("排序后的时间是=" + dateStr1);
}