快速排序详解
原理:
快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。
然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
java代码`
package four;
/**
* 快速排序:找一个基准数,基准数的左边都是比它小的数,右边则都是比它大的数
*/
public class QuickSort {
public static void main(String[] args) {
int[] array = {5,3,7,6,4,1,0,2,9,10,8};
int[] sortArray = quickSort(array, 0, array.length-1);
for (int i = 0; i < sortArray.length; i++) {
System.out.print(sortArray[i]+" ");
}
}
public static int[] quickSort(int[] array,int left,int right){
sout(array);
int key = array[left];
int i = left;
int j = right;
while (i < j){
while (i < j && array[j] > key){
j--;
}
while (i < j && array[i] < key){
i++;
}
if (i < j && array[i] == array[j]){
i++;
}else {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
sout(array);
}
}
if (i-1 > left){
array = quickSort(array,left,i-1);
}
if (j+1 < right){
array = quickSort(array,j+1,right);
}
return array;
}
private static void sout(int[] array){
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
System.out.println();
}
}
过程解读:
1.原数组:
[5 3 7 6 4 1 0 2 9 10 8]
2.从后往前寻找第一个比基准数5小的数为2,则交换基准数5与2的位置:
[2 3 7 6 4 1 0 5 9 10 8 ]
3.从前往后找第一个比基准数5大的数为7,则交换5与7的位置:
[2 3 5 6 4 1 0 7 9 10 8]
4.以此类推,比完一轮之后,5的左边都是比它小的数,右边都是比它大的数:
[2 3 0 1 4 5 6 7 9 10 8]
5.基准数左边的数和右边的数,递归调用,重复上述操作,直到排序完成:
[0 1 2 3 4 5 6 7 8 9 10]