快速排序法介绍
快速排序法的示意图
快速排序法的应用实例
代码实现
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class QuickSort4 {
public static void main(String[] args) {
// int[] arr = {-9,78,0,23,-567,70};
int[] arr = {5,2,6,0,3,9,1,7,4,8};
// System.out.println("排序前:");
// System.out.println(Arrays.toString(arr));
//测试一下快速排序的速度,给80000个数据,测试
int[] arr = new int[8000000];
for (int i = 0; i < 8000000; i++) {
arr[i] = (int)(Math.random() * 8000000); //生成一个【0,8000000)数
}
Date date1 = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1Str = simpleDateFormat.format(date1);
System.out.println("排序前的时间是:"+date1Str);
quickSort(arr,0,arr.length-1);
Date date2 = new Date();
String date2Str = simpleDateFormat.format(date2);
System.out.println("排序后的时间是:"+date2Str);
// System.out.println("排序后:");
// System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int low, int high){
//指定左指针l和右指针r
int l = low;
int r = high;
if(low < high){ //递归何时结束
//将最后一个数作为基准值。挖坑
int point = arr[high];
//使用循环实现分区操作
while(l < r){ //当l==r时,代表比基准值小的数都已经被移动到基准值的左边了,比基准值大的数都已经被移动到基准值的右边了
//1.从左向右移动l,找到第一个大于基准值的值 arr[l]
while(l < r && arr[l] <= point){
l++;
}
//2.将左侧找到的大于基准值的值加入到右边的坑中(即arr[l]和基准值point交换位置)
// 坑:即基准值所处的位置
swap(arr,l,r);
//3.从右向左移动r,找到第一个小于基准值的值 arr[r]
while(l < r && arr[r] >= point){
r--;
}
//4.将右侧找到的小于基准值的值加入到左边的坑中(即arr[r]和基准值point交换位置)
swap(arr,l,r);
}
//对左分区进行快排
quickSort(arr,low,l-1);
//对右分区进行快排
quickSort(arr,l+1,high);
}
}
private static void swap(int[] arr, int low, int high) {
int temp = arr[low];
arr[low] = arr[high];
arr[high] = temp;
}
}
结果截图:
800w个数据用 快速排序 大约耗时1s,比 希尔排序 快(希尔排序需要2到3s)