快速排序

一、算法思想:“分而治之的思想”,

(1)在待排序列中,選擇一個基準元素(一般選擇第一個數或最後一個)

(2)依據基準元素,將序列分成兩個子序列,小於等於基準元素的放在左邊,大於基準元素的放在右邊。

(3)合併兩個子序列(合併後不需要整體排序,因爲之前分別是有序的)

(4)遞歸堆兩個子序列進行遞歸排序,直到序列只有一個元素爲止。

二、代碼如下:

import java.util.Arrays;
public class QuickSort {
	public static void quickSort(int[] array,int low,int high){
		//數組不合法,返回
		if(low>=high){
			return;
		}
		int i=low;
		int j=high;
		int index=array[i];//標識基準元素
		while(i<j){
			//從後面開始遍歷比index元素小的值
			while(i<j && array[j]>index) j--;
			//出循環時要麼i>j,要麼當前元素小於index,然後移動
			if(i<j) array[i++]=array[j];
			//從前面開始遍歷比index元素大的值
			while(i<j && array[i]<index) i++;
			//出循環時要麼i>j,要麼當前元素大於index,然後移動
			if(i<j) array[j--]=array[i];
		}
		//將index放回數組的空位
		array[i]=index;
		quickSort(array,low,i-1);
		quickSort(array,i+1,high);
		
	}
	public static void main(String[] args){
		int[] array={4,7,3,2,8,6,9,5};
		quickSort(array,0,array.length-1);
		System.out.println(Arrays.toString(array));
	}

}

三、時間複雜度:O(nlogn)

四、空間複雜度:O(logn),快速排序時藉助一個棧空間實現遞歸,當劃分區間均勻時,遞歸樹的深度爲logn+1,logn向上取整,當剛好劃分爲一邊區間剛好爲0時,遞歸樹的深度爲n,每次排序後最好記錄一下基準元素兩邊的個數,然後從多的一邊開始排序,棧的深度可降爲logn,

五、不穩定的排序算法,n較大時效率高,待排序列基本有序時退化爲冒泡排序;

六、歸併排序和快速排序的異同點:

相同:都是“分而治之”的思想,將待排序列分爲兩組,分別對兩組進行排序,然後將這兩個組進行合併。

不同:分組策略和合並策略不同。歸併排序的分組策略:將待排序列直接按個數分爲兩組,前面一半作爲一組,後面一半爲另一組。合併策略:將兩個子序列進行合併排序。 快速排序分組策略:選擇一個基準元素,小於等於基準元素的爲一組,大於基準元素的爲另一組,合併策略:因爲快速排序分組時已經根據元素大小分組了,所以合併的時候直接合並就好。

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