1、简单介绍
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
**
2、示意图

3、源码
package com.study.sort;import java.util.Arrays;import java.util.Random;public class QuickSort {public static void main(String[] args) {int[] arr ={20,30,10,0,-10,-50,-30};quickSort(arr,0,(arr.length)-1);System.out.println(Arrays.toString(arr));}public static void quickSort(int[] arr,int left,int right){int l = left;//左下标int r = right;//右下标int center = arr[(r+l)/2];//中间值int temp = 0;//定义一个临时变量//while循环比较center左右两边的值与center的大小,进行交换,值小的放左边while (l < r){//左边不断循环,找到arr[l] > center的数while (arr[l] < center){l++;}//右边不断循环,找到arr[l] < center的数while (arr[r] > center){r--;}//如果左下标大于或等于右下标,结束循环if (l >= r){break;}//左右两边交换temp = arr[l];arr[l] = arr[r];arr[r] = temp;//如果arr[l] == center ,r--,防止进入死循环if (arr[l] == center){r--;}if (arr[r] ==center){l++;}}//如果l==r,说明一轮排序结束,将左下标l往后移,右下标r往前移if (l == r){l+=1;r-=1;}//左递归if (left < r){quickSort(arr,left,r);}//右递归if (right > l){quickSort(arr,l,right);}}}
4、运行结果
5、时间测试
package com.study.sort;import java.util.Arrays;import java.util.Random;public class QuickSort {public static void main(String[] args) {/*int[] arr ={20,30,10,0,-10,-50,-30};quickSort(arr,0,(arr.length)-1);System.out.println(Arrays.toString(arr));*/int[] arr = new int[80000];Random random = new Random();for (int i = 0; i < 80000; i++) {arr[i] = random.nextInt(800000000);}long l1 = System.currentTimeMillis();quickSort(arr,0,(arr.length)-1);long l2 = System.currentTimeMillis();System.out.println("快速排序对"+arr.length+"个数据排序所花费的时间为:"+(l2-l1)+"ms");}public static void quickSort(int[] arr,int left,int right){int l = left;//左下标int r = right;//右下标int center = arr[(r+l)/2];//中间值int temp = 0;//定义一个临时变量//while循环比较center左右两边的值与center的大小,进行交换,值小的放左边while (l < r){//左边不断循环,找到arr[l] > center的数while (arr[l] < center){l++;}//右边不断循环,找到arr[l] < center的数while (arr[r] > center){r--;}//如果左下标大于或等于右下标,结束循环if (l >= r){break;}//左右两边交换temp = arr[l];arr[l] = arr[r];arr[r] = temp;//如果arr[l] == center ,r--,防止进入死循环if (arr[l] == center){r--;}if (arr[r] ==center){l++;}}//如果l==r,说明一轮排序结束,将左下标l往后移,右下标r往前移if (l == r){l+=1;r-=1;}//左递归if (left < r){quickSort(arr,left,r);}//右递归if (right > l){quickSort(arr,l,right);}}}
6、测试结果




因为分割的数center是随机选择的,可以选择数据中任何位置的数,选择的数的大小并不能确定为中值,所以当选择的数偏大或偏小,效率便会下降。
对80000个随机数排序,总体速度还是挺快的,但有一点不稳定。

