首先先看一下快速排序的百度百科解释:
快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
思路:
- 以一个数为基准数(一般为头数或者尾数),再定义头尾两个游标,头游标依次往右移并进行判断是否比基准数小直至遇到比基准数大的数;尾游标依次往左移并进行判断是否比基准数大直至遇到比基准数小的数。接着将两个游标所在的数进行swap交换操作。
- 循环判断并进行swap操作,直至left<right,即头游标小于尾游标不成立。此时需要将基准数与头游标后者尾游标(两数理论上应该是重合状态)swap操作。
- 上述1,2完成一次递归,将数分成以基准数为标准,左部分比基准数小,右部分比基准数大的两部分。接着一次递归1,2部分,直至完成。
代码如下:
public class QuickSort {
public static int[] quick(int[] arr,int head, int tail){
if (head<0 || tail>=arr.length || head>tail){
return null;
}
int start = head;//头游标
int end = tail;//尾游标
int temp = head;//默认第一个数为基准数
while (head<tail) {
//头游标依次比较,注意防止数组越界
while (head<tail && arr[temp]<=arr[tail]){
tail--;
}
//尾游标依次比较,并且判断大小的时候加上等于可防止因为第一次比较就不成立导致基准数与尾游标交换
while (head<tail && arr[temp]>=arr[head]){
head++;
}
//头游标此时比基准数大,尾游标此时比基准数小,进行swap操作
swap(arr, head, tail);
}
//完成一次递归,将基准数与头游标进行交换
swap(arr, temp, head);
//分出来两部分,依次递归排序
quick(arr, start, head-1);
quick(arr, head+1, end);
return arr;
}
//交换元素操作
public static void swap(int[] arr,int head, int tail){
int temp = arr[head];
arr[head] = arr[tail];
arr[tail] = temp;
}
public static void main(String[] args) {
int[]arr = {5,8,1,4,9,2,6,7,11,15,13,14};
int[] quick = quick(arr, 0, arr.length - 1);
for (int item : quick) {
System.out.print(item + " ");
}
}
}