1. 程式人生 > >@快速排序演算法(JAVA)(個人複習)

@快速排序演算法(JAVA)(個人複習)

@快速排序演算法(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);