基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
public class QuickSort {
public static void main(String[] args) {
//测试数据
int[] iArgs = {5,4,9,2,8,3,1,7};
int left = 0; //数组第一个位置
int right = iArgs.length - 1;//数组最后一个位置;
QuickSort quickSort = new QuickSort();
//快速排序
quickSort.recursive(iArgs,left,right);
//输出数组
for(int i = 0; i < iArgs.length; i++) {
System.out.print(iArgs[i] + " ");
}
}
/**
* 递归循环数据
*
* @param args 数组
* @param left 数组左下标
* @param right 数组右下标
* @return
*/
private void recursive(int[] args,int left,int right) {
if( left < right) {
//数据从left到right坐标的数据进行排序
int iIndex = qucikSort(args,left,right); //iIndex 是基数放在数据位置
//递归算法,对于基数左边排序
recursive(args,left,iIndex-1); //为什么left不能从0
//递归算法,对于基数右边排序
recursive(args,iIndex+1,right);//为什么 right不等于length
}
}
/**
* 确定基数左边的数都比它小,右边的数都比它大
*
* @param args 数组
* @param left 数组左下标
* @param right 数组右下标
* @return
*/
private int qucikSort(int[] args,int left,int right) {
int iBase = args[left];; //基准数
while (left < right) {
//从右向左找出第一个比基准数小的数
while( left < right && args[right] >= iBase) {
right--;
}
args[left] = args[right];
//从左向右找出第一个比基准数小的数
while( left < right && args[left] <= iBase) {
left++;
}
args[right] = args[left];
}
args[left]= iBase;
return left;
}
}
另一种写法:
public class QuickSort {
/**
* @param args
*/
public static void main(String[] args) {
int[] array = {10, 20, 15 , 16, 18 , 17, 12, 13, 19, 11, 14};
QuickSort(array, 0, array.length - 1);
for(int i = 0; i < array.length; i++){
System.out.print(array[i]+" ");
}
}
private static void QuickSort(int[] array, int low, int high) {
if(low < high){
int position = Partition(array, low, high);
QuickSort(array, low, position-1);
QuickSort(array, position+1, high);
}
}
private static int Partition(int[] array, int low, int high) {
int start = low;
int end = high + 1;
int compare = array[low];
int tmp;
while(true){
while(array[++start] < compare && start < high);
while(array[--end] > compare);
if(start >= end) break;
tmp = array[start];
array[start] = array[end];
array[end] = tmp;
}
array[low] = array[end];
array[end] = compare;
return end;
}
}