快速排序(Quicksort):是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以数组中间元素作为关键数据,赋值给key,即key=A[N/2];
3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
public class QuickSort {
static final int SIZE = 10;
public static void main(String[] args) {
int arr[] = new int[SIZE];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * 100);
}
System.out.println("排序前的数组:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
quickSort(arr, 0, SIZE - 1);
System.out.println("快速排序后的数组:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
private static void quickSort(int[] a, int low, int high) {
if(low<high){ //如果不加这个判断递归会无法退出导致堆栈溢出异常
int middle = getMiddle(a,low,high);
quickSort(a, 0, middle-1);
quickSort(a, middle+1, high);
}
}
private static int getMiddle(int[] a, int low, int high) {
int temp = a[low];//设置基准值temp
while(low<high){
while(low<high && a[high]>=temp){
high--;
}//从后往前找到第一个比基准元素小的元素位置
a[low] = a[high]; //将其赋值给a[low]
while(low<high && a[low]<=temp){
low++;
}//从前往后找到第一个比基准元素大的元素位置
a[high] = a[low];//将其赋值给a[high]
}
a[low] = temp;//将本轮基准值赋值给新的a[low]此时比基准值temp小的数都在a[low]左边
//比基准值temp大的数都在a[low]右边
return low;//返回此轮基准值temp的此轮排序后的索引
}
}
输出:
排序前的数组:
1 43 48 99 21 67 34 17 87 22
快速排序后的数组:
1 17 21 22 34 43 48 67 87 99