一 原理
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此达到整个数据变成有序序列。
示例:
1 对”6 1 2 7 9 3 4 5 10 8”这10个数进行排序。将这个组数存入数组arr,选择数组的第一个元素”6”作为基准,下标为0;分别从左边右边向中间找:
左边:如果后一个元素比6小,下标加1,继续向后找,直到找到大于6的元素才停止;
右边:如果后一个元素比6大,下标减1,继续向前找,直到找到小于6的元素才停止;
执行完以上操作,若果左边的下标比右边的下标小,交换左右下标对应元素的位置,继续重复以上操作继续查找,直到左边的下标等于右边的下标。
2 当左边的下标和右边的下标指向同一个元素时(即左边的下标等于右边的下标=j),交换第一个元素和该元素的位置;原来的数组的顺序就为:3 1 2 5 4 6 9 7 10 8。
3 递归:
6左边的数:3 1 2 5 4,执行1),2)操作后,变为:1 2 3 5 4;
再对3右边的数:5 4执行1),2)操作后,变为1 2 3 4 5;
6右边的的数处理方法和6左边的数处理方法相同,变为7 8 9 10。
4经过上述三步处理这10个数的顺序为:1 2 3 4 5 6 7 8 9 10。
二 Java代码实现
public class QuickSort11 {
public static void main(String[] args) {
int[] arr = {5,3,12,34,22,3,5,6,8,3,2,4,0,44,123,44};
quickSort(arr,0,arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
private static void quickSort(int[] arr, int min, int max) {
if(min>max){
return;
}
int i=min;
int j=max;
int temp;//用于交换的中间变量
//定义数组的第一个元素为基准
int flag=arr[min];
while(i<j){
//看j(右边), 依次往左边递减
while(flag<=arr[j]&&i<j){
j--;
}
//看i(左边),依次往右边递增
while(flag>=arr[i]&&i<j){
i++;
}
/*
* 右边找到比flag小的数停下
* 左边找到比flag大的数停下
* 如果满足i<j条件,交换位置继续循环查找
* 直到i=j,跳出循环
*/
if(i<j){
temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}
//将基准arr[0]与i的位置交换
arr[min]=arr[i];
arr[i]=flag;
//左边的数比flag小,右边的数比flag大,左右两边的数大小无序
//递归,对flag左边的数排序
quickSort( arr, min, j-1);
//递归,对flag右边的数排序
quickSort(arr, j+1, max);
}
}
快排的性能在所有排序算法里面是最好的,数据规模越大快速排序的性能越优。快排在极端情况下会退化成