排序算法之快速排序筆記

下面代碼拷貝這個人的博客

這篇博客寫的很清楚,可以去參考看下

白話經典算法系列之六 快速排序 快速搞定: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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章