簡單排序算法時間空間複雜度分析及應用(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);
}
下面幾個文章等再分析幾個排序算法後,會分析比較這些算法的不同。