快速排序:
基本思想:選擇個基準數(一般是第一個元素或最後一個元素),然後以基準數分開左右邊。
* 左邊全部比基準數小
* 右邊全部比基準數大
* 直到左右指針相等,交換下標爲左右指針相等的數和基準數
* 遞歸重複。
/**
* 快速排序
*
* @author Ant
*
*/
public class QuickSort {
/**
* 基本思想:選擇個基準數(一般是第一個元素或最後一個元素),然後以基準數分開左右邊。
* 左邊全部比基準數小
* 右邊全部比基準數大
* 直到左右指針相等。交換基準數
* 遞歸重複。
*
* 不妨假設左右移動指針爲“左右步兵”。他們找到該找的位置後交換。直到相遇。
* @param a
* @param left
* @param right
*/
public static void quickSort(int a[], int left, int right) {
//大前提,當left>right,遞歸結束。
if(left>right)
return;
//定義兩移動步兵i,j 。 一個存基準數的key
int i, j, key;
i = left;
j = right;
key = a[left];//基準數
//當他們還沒相遇時
while(i!=j){
//右步兵要找比基準數要小的數,停下來。否則向左移動。
while(a[j] >= key && i<j)
j--;
//左步兵要找比基準數要大的數,停下來。否則向右移動。
while(a[i] <= key && i<j)
i++;
//當他們都停下來,交換彼此位置
if(i<j){
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//最後他們相遇了。交換相遇位置和基準位置。
a[left] = a[i];
a[i] = key;
//遞歸
quickSort(a, left, i-1);
quickSort(a, i+1, right);
}
public static void main(String[] args) {
int a[] = { 11, 38, 24, 10, 3, 5, 18 };
QuickSort.quickSort(a, 0, a.length - 1);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i] + " ");
}
}
}