快速排序(Quicksort)
1.基本介绍
快速排序(Quicksort)是对冒泡排序的一种改进。 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
2.快速排序的示意图
- 代码
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
/*int[] arr = {-9,78,0,23,-567,70, -1,900, 4561};
// int[] arr = {5, 8, 5, 5, 5};
System.out.println("排序之前: " + Arrays.toString(arr));
quickSort(arr, 0, arr.length - 1);
System.out.println("排序之后: " + Arrays.toString(arr));*/
int arr[] = new int[8000000];
for (int i = 0; i < 8000000; i++) {
arr[i] = (int)(Math.random() * 1000000000); //随机生成一个[0,1000000)之间的数
}
//开始时间
long startTime = System.currentTimeMillis();
quickSort(arr, 0, arr.length - 1);
long endTime = System.currentTimeMillis();
System.out.println("排序花了: " + (endTime - startTime) + "ms");
}
//快速排序
public static void quickSort(int[] arr, int left, int right){
int l = left; //左下标
int r = right; //右下表
int pivot = arr[(left + right) / 2]; //中轴值
int temp = 0; //交换时使用
//while循环的目的是将比pivot小的值放到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;
//如果没有下面两个if,则当 arr[l] == pivot,和arr[r] == pivot时,while循环
//就会一直比较交换这两个数,就没有办法继续向下走了;
//当arr[l] == pivot 时,r-=1,则会arr[l]这个数会反复的在pivot左右
//反复横跳,直至出现在中间(arr[r] == pivot类似)
//如果交换完之后,发现arr[l] == pivot,则r-- ,前移
if(arr[l] == pivot){
r -= 1;
}
//如果交换完之后,发现arr[r] == pivot,则l-- ,后移
if(arr[r] == pivot){
l += 1;
}
}
//如果 l == r(奇数个时l==r指向中间pivot,然后 l++,r--使得能继续向下递归),必须l++,r--,否则会出现栈溢出
if(l == r){
l++;
r--;
}
//向左递归
if(left < r){
quickSort(arr, left, r);
}
//向右递归
if(right > l){
quickSort(arr, l, right);
}
}
}
- 结果