package com.zz.sort;
import java.util.Random;
public class QuickSort {
public static void main(String[] args) {
// int[] iArgs = new int[]{72,6,57,88,60,42,83,73,48,85};
int iLength = 5;
int[] iArgs = new int[iLength];
for(int i = 0; i < iLength; i++){
Random objRandom = new Random();
iArgs[i] = objRandom.nextInt(1000);
}
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;
}
}