概述
建议哔哩哔哩一下:
快速排序;
快速排序的思想:
- 递归,然后每一次有一个标准,执行之后的结果就是,标准的左边的值都比右边的值小。
注意:
- 快速排序的思想都是一致的,但是不同代码选择的标准可能是不同的
比如:- 第一个元素
- 中间位置的元素
- 最后一个元素
归并排序是先递归再排序
快速排序是先排序再递归
图示
代码
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class quickSort {
/*
* 快速排序
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr1 = { 1,2,3,10,4,5,6,23,45};
quick(arr1, 0, arr1.length - 1);
System.out.println(Arrays.toString(arr1));
int[] arr = new int[30000000];
for (int i = 0; i < 30000000; i++) {
arr[i] = (int) (Math.random() * 8000000); // 生成一个[0, 8000000) 数
}
Date data1 = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1Str = simpleDateFormat.format(data1);
System.out.println("排序前的时间是=" + date1Str);
long startMili = System.currentTimeMillis();
System.out.println("开始 " + startMili);
// 测试冒泡排序
// quick(arr, 0, arr.length - 1);
long endMili = System.currentTimeMillis();
System.out.println("耗时 " + (endMili - startMili));
Date data2 = new Date();
String date2Str = simpleDateFormat.format(data2);
System.out.println("排序后的时间是=" + date2Str);
}
// 实现快速排序
public static void quick(int[] arr, int left, int right) {
int a=left;
int b=right;
int mid=(left+right)/2;
int pointer=arr[mid];
int temp=0;
if(left==mid) {
if(arr[left]>arr[right]) {
temp=arr[left];
arr[left]=arr[right];
arr[right]=temp;
}
return;
}
//排序
while (a<b) {
while (arr[a]<pointer&&a<b) {//左边找小于标准的
a++;
}
while (arr[b]>pointer&&a<b) {//右边找大于标准的
b--;
}
if(a<b) {//找到了就交换位置
temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
a++;
b--;
}
}
//向左递归
quick(arr, left, b);
//向右递归
quick(arr, a, right);
}
}