@快速排序演算法(JAVA)(個人複習)
阿新 • • 發佈:2019-01-14
@快速排序演算法(JAVA)
一趟快速排序過程
一趟快速排序程式碼
static int[] arr;
public static int quickSort(int l , int h)//一趟快速排序
{
int temp = arr[l];//每次去第一個作為支點 while(l < h) { while(l< h && arr[h] >= temp ) { h--; } if(l < h) { arr[l] = arr[h]; l++; } while(l < h && arr[l] < temp) { l++; } if(l < h) { arr[h] = arr[l]; h--; } } arr[l] = temp; return l; }
最後使用遞迴的方式
public static void qSort(int l , int h)
{
if(l < h)
{
int i = quickSort(l , h);
qSort(l , i-1);
qSort(i+1,h);
}
}
下面討論快速排序的時間和空間複雜度
空間複雜度:
快速排序需要用棧來實現遞迴過程。遞迴過程借用二叉樹表示,最好情況每次分割均勻,遞迴樹高度為O(log2n),空間複雜度為O(log2n);最壞情況是遞迴樹為單支樹,高度為O(n),空間複雜度為O(ln);
時間複雜度:
先分析一趟快速排序:
對於一個有n個元素的待排序列,一趟快速排序需要和支點比較n次左右,所以時間複雜度為O(n);
分析整個快速排序:
最後情況是每次劃分後兩個子表等長在這裡插入圖片描述
最壞情況:
每次分割只得到一個子表(支點基本有序);這樣的話快速排序就轉換為氣泡排序,時間複雜度為o(n*n);