package cn.xiaobo.QuickSort;html
/**
* 快速排序的思想:選準一個基準點;通常拿數組的第一個元素做爲基準點;
* 而後選取兩個指針;i=left;j=right;兩邊進行;小於基準點的放在左邊;大於放在右邊;
* 最後i=j;將基準點的值給arr[i];
* 再如下標i爲界限依次進行遞歸;不要忘記跳出遞歸的條件是i=j;
* 參考博客:https://www.cnblogs.com/foreverking/articles/2234225.html
* 他的源程序我作了點改動;
* @author Administrator
*
*/
public class QuickSortMain {
public static void main(String[] args) {
int[] arr=new int[10];
// for(int i=0;i<10;i++){
// arr[i]=10-i;
// };
arr[3]=67;
arr[4]=76;
arr[5]=99;
arr[6]=64;
arr[1]=2;
arr[0]=1;
arr[2]=6;
QuickSortApp quickSortApp=new QuickSortApp();
System.out.print("排序前:");
for(int i=0;i<10;i++){
System.out.print(arr[i]+" ");
};
quickSortApp.Sort(arr, 0, 9);
System.out.print("排序後:");
for(int i=0;i<10;i++){
System.out.print(arr[i]+" ");
};
}數組
}ui
package cn.xiaobo.QuickSort;spa
public class QuickSortApp {.net
public void Sort(int[] arr,int _left,int _right) {
int left=_left;
int right=_right;
//遞歸的臨界點是左邊邊界等於右邊邊界;
if(left<right){
//最後的結果必定是左邊的下標等於右邊的下標
//選取基準點
int temp=arr[left];
while(left!=right){
//先從right開始搜索,當搜索到比temp小時,跳出循環
while(left<right&&arr[right]>temp){
right--;
}
//arr[left]的值給了temp,因此先把arr[right]給arr[left]
//多出一個空位
if(right>left){
arr[left]=arr[right];
}
//循環中找到比temp大的值;
while(left<right&&arr[left]<=temp){
left++;
}
//左邊搜索到了比temp大的值,放在右邊空缺的位置
if(right>left){
arr[right]=arr[left];
}
}
//把基準值給最後一個;
arr[left]=temp;
//再對兩邊進行遞歸,因爲arr[i]已是排好序的,因此不用加入;
Sort(arr,_left,left-1);
Sort(arr,right+1,_right);
}
}
}指針