簡單排序算法時間空間複雜度分析及應用(3)-快速排序

簡單排序算法時間空間複雜度分析及應用(3)-快速排序

和之前的兩種算法比較:

      1.快速算法適合在n值(排序規模比較大)較大的場景下使用,快速排序算法時間會少一點。

      2.冒泡排序和插入排序適合n值較小的場景下使用,如果待排序區並不是都雜亂無序,即有些區域是有序

 的,使用冒泡排序和插入排序比較好一點。

      3.快速排序適合用在次序分佈隨機的場景下應用。

    快速排序過程中涉及到的新概念是:確定區元。該算法運用分層遞歸的思想,每一個遞歸層都會確定兩個確定區元,然後每個確定區元下面又會確定兩個區元,直至一個區元或者沒有區元。

確定區元:指的是多個區元之間已經確定關係的待確定區域,即在某個方向上(由左向右或由右向左),區元的所有數據都小於或這都大於後面其他區元的所有數據,但是這些區域中的數都是未確定節點,即沒經過排序的。這些區域被稱爲確定區元。

                如下圖所示



               

一般快速排序會把最後一個數據節點當作中間比較元素,這個元素插在兩個確定區元的中間,然後區元內部再遞歸快速排序下去,

快速排序的圖解:



快速排序java實現:

/*
	 * 快速排序 quickSort
	 * 快速排序時間複雜度nlog(n);
	 * @param 輸入true爲增序列,false爲降序
	 */
	public static void quickSort(boolean flag){
		
		int [] arr =  array;
		System.out.println(arr.length);
		quicksort(arr , 0 , arr.length - 1 , flag);
	}
	
	
	private static void quicksort(int[] arr, int i, int j , boolean flag) {
		// TODO Auto-generated method stub
		if(i >= j)	return; 
		int p = i , q = i , k ;
		for(  ; q < j ; ++ q)
		{
			if((arr[q] < arr[j]&&flag)||(arr[q] > arr[j] && !flag))
			{ 
				k = arr[q];
				arr[q] = arr[p];
				arr[p] = k;
				++p;
			}	
		}
		//將中間比較元素放到連兩個確定區元的中間,區元X:i至p-1。確定區元Y:p+1至j
		if(p != q)
		{
			k = arr[q];
			arr[q] = arr[p];
			arr[p] = k;
		}
		//遞歸快速排序兩個確定區元。
		quicksort(arr , i , p-1 , flag);
		quicksort(arr , p+1 , j , flag);
	}

下面幾個文章等再分析幾個排序算法後,會分析比較這些算法的不同。


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