下面代碼拷貝這個人的博客
這篇博客寫的很清楚,可以去參考看下
白話經典算法系列之六 快速排序 快速搞定:http://blog.csdn.net/morewindows/article/details/6684558
備註:以一個數爲基準,將其他數比它小的放到左邊,比它大的放到右邊
在以這個數所在位置爲邊界(i - 1與 i + 1)
分別處理左部份和右部份(由於左半部分(子數組)與右半部分類(子數組)似於父數組,所以利用分治法(遞歸處理))
1. 排序效率:O(N*logN)
2. 每次左右遍歷一遍 只是一個數的位置爲調整正確,然後不在處理這個數,而是以這個數的位置爲邊界,切割成兩個子部分分開處理,
這兩個部分之間沒有任何關係。
3. 處理中間的過程類似一個二叉樹:
這個二叉樹的節點數就是這個需要排序的數組的元素總數,層數爲循環的次數(logN),每次循環操作的步驟數(N)
從而每次排好次序的元素數爲2的i次方 i爲層數序號(序號從0開始);
public class Sort {
// 快速排序
static void quick_sort(int s[], int l, int r) {
if (l < r) {
// s[(l + r) / 2]; 將中間的這個數和第一個數交換
int i = l, j = r, x = s[l]; //s[l]即s[i]就是第一個坑
while (i < j) {
while (i < j && s[j] >= x)
// 從右向左找第一個小於x的數
j--;
if (i < j)
s[i++] = s[j]; //i++從左往右下一次需要操作的數
while (i < j && s[i] < x)
// 從左向右找第一個大於等於x的數
i++;
if (i < j)
s[j--] = s[i]; //j--從右往左下一次需要操作的數
}
//退出時,i等於j。將x填到這個坑中。
s[i] = x;
quick_sort(s, l, i - 1); // 遞歸調用
quick_sort(s, i + 1, r);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] s = new int[] { 45, 56, 78, 12, 45, 90, 1, 3 };
quick_sort(s, 0, 7);
/*
* foreach的語句格式: for(元素類型t 元素變量x : 遍歷對象obj){ 引用了x的java語句;
* foreach循環只能用於讀取,不能改變對應的值 }
*/
for (int i : s) {
System.out.println(i);
}
}
}
輸出爲:
1
3
12
45
45
56
78
90