快速排序
1、快速排序法介绍
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
2、快速排序法示意图
3、快速排序法应用实例
package com.xu.sort;
import java.text.SimpleDateFormat;
import java.util.Date;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {101, 34, 119, 1, -1, 90, 123};
// int[] arr = new int[80000];
// for (int i = 0; i < 80000; i++) {
// //生成一个[0,8000000)整数
// arr[i] = (int) (Math.random() * 80000);
// }
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);
date1 = new Date();
date1Str = simpleDateFormat.format(date1);
System.out.println("排序后的时间是=" + date1Str);
}
//快速排序
public static void quickSort(int[] arr, int left1, int right1) {
//左下标
int left = left1;
//右下标
int right = right1;
//中值
int pivot = arr[(left1 + right1) / 2];
//临时变量
int temp = 0;
//while循环的目的是让比pivot值小放到左边,比pivot值大放到右边
while (left < right) {
//在pivot的左边一直找,找到大于等于pivot值,才退出
while (arr[left] < pivot) {
left += 1;
}
//在pivot的右边一直找,找到小于等于pivot值,才退出
while (arr[right] > pivot) {
right -= 1;
}
//如果left>=right说明pivot的左右两的值,已经按照左边全部是小于等于pivot值,右边全部是大于等于pivot值
if (left >= right) {
break;
}
//交换
temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
//如果交换完后,发现这个arr[left]==pivot值相等right--,前移
if (arr[left] == pivot) {
right -= 1;
}
//如果交换完后,发现这个arr[right]==pivot值相等left++,后移
if (arr[right] == pivot) {
left += 1;
}
}
//如果left==right,必须left++,right--,否则为出现栈溢出
if (left == right) {
left += 1;
right -= 1;
}
//向左递归
if (left1 < right) {
quickSort(arr, left1, right);
}
//向右递归
if (right1 > left) {
quickSort(arr, left, right1);
}
}
}