Java排序算法(五):快速排序

 Java排序算法(五):快速排序

快速排序是一個速度非常快的交換排序算法,它的基本思路很簡單,從待排的數據序列中任取一個數據(如第一個數據)作爲分界值,所有比它小的數據元素放到左邊,所有比它大的數據元素放到它的右邊。經過這樣一趟下來,該序列形成左右兩個子序列,左邊序列中的數據元素的值都比分界值小,右邊序列中數據元素的值都比分界值大。
接下來對左右兩個子序列進行遞歸排序,對兩個子序列重新選擇中心元素並依此規則調整,直到每個元素子表的元素只剩下一個元素,排序完成。

思路:
1.定義一個i變量,i變量從左邊第一個索引開始,找大於分界值的元素的索引,並用i來記錄它。
2.定義一個j變量,j變量從右邊第一個索引開始,找小於分界值的元素的索引,並用j來記錄它。
3.如果i<j,交換i,j兩個索引處的元素。
重複執行以上1,2,3步,直到i>=j,可以判斷j左邊的數據元素都小於分界值,j右邊的數據元素都大於分界值,最後將分界值和j索引處的元素交換即可。

時間複雜度
最好情況(每次總是選到中間值作樞軸)T(n)=O(nlogn)
最壞情況(每次總是選到最小或最大元素作樞軸)
做n-1趟,每趟比較n-i次,總的比較次數最大:[O(n²)]
平均時間複雜度爲::T(n)=O(nlogn)

代碼實現:

package sort;

public class QuickSortTest {

	public static void main(String[] args) {
		int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
		print(data);
		quickSort(data, 0, data.length - 1);
		System.out.println("排序後的數組:");
		print(data);
	}

	public static void swap(int[] data, int i, int j) {
		if (i == j) {
			return;
		}
		data[i] = data[i] + data[j];
		data[j] = data[i] - data[j];
		data[i] = data[i] - data[j];
	}

	public static void quickSort(int[] data, int start, int end) {
		if (start >= end)
			return;
		//以起始索引爲分界點
		int pivot = data[start];
		int i = start + 1;
		int j = end;
		while (true) {
			while (i <= end && data[i] < pivot) {
				i++;
			}
			while (j > start && data[j] > pivot) {
				j--;
			}
			if (i < j) {
				swap(data, i, j);
			} else {
				break;
			}
		}
		//交換 j和分界點的值
		swap(data, start, j);
		print(data);
		//遞歸左子序列
		quickSort(data, start, j - 1);
		//遞歸右子序列
		quickSort(data, j + 1, end);
	}

	public static void print(int[] data) {
		for (int i = 0; i < data.length; i++) {
			System.out.print(data[i] + "\t");
		}
		System.out.println();
	}

}


運行結果:

5	3	6	2	1	9	4	8	7	
1	3	4	2	5	9	6	8	7	
1	3	4	2	5	9	6	8	7	
1	2	3	4	5	9	6	8	7	
1	2	3	4	5	7	6	8	9	
1	2	3	4	5	6	7	8	9	
排序後的數組:
1	2	3	4	5	6	7	8	9



 

 

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