一、演算法簡介
快速排序(quicksort)是對氣泡排序的一種改進。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
二、演算法描述
快速排序使用分治法來把乙個串(list)分為兩個子串行(sub-lists)。
步驟為:
1、從數列中挑出乙個元素,稱為 "基準"(pivot),
2、重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
3、遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。
最差時間複雜度
o(n log n)
最優時間複雜度
o(n log n)
平均時間複雜度
o(n log n)
最差空間複雜度
需要額外輔助空間o(1)
三、演算法**
四、示例**
publicclass
quicksort
private
int quick(int a, int low, int
high)
return
a; }
//首先任意選取乙個資料(通常選用陣列的第乙個數)作為關鍵資料,
//然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面
private
int sort(int a, int low, int
high)
if (i
while (i < j && a[i] <=key)
if (i
} a[i] =key;
}return
i; }
演算法學習(五) 基本排序演算法總結
前幾天學習幾個基本的排序演算法,下面來總結一下 在維基百科上有排序演算法的一張圖,紅線是我之前總結學習的。從我們學習的排序演算法中可以分為兩類 簡單排序有冒泡 選擇 插入排序 改進演算法有希爾 堆排序 歸併排序和快速排序。快速排序是冒泡的公升級版,屬於交換排序 希爾排序是直接插入排序的公升級,屬於插...
演算法學習 快速排序
快速排序 分治演算法 const int n 1e6 10 int a n a 待排序陣列,l 排序陣列的起始下標,r 排序陣列的結束下標 void quick sort int a,int l,int r 遞迴的終止條件 int x a l 選取排序的比較物件 int i l 1 設定排序的左指標...
演算法學習 快速排序
1 基本思想 取待排序陣列第乙個數作為參照數,建立left和right陣列,left儲存小於參照數的陣列集合,right儲存大於參照數的陣列集合,然後分別對left和right進行遞迴呼叫排序。2 舉例 11,2,3,43,23,5,6,9,10 取任意的乙個數為基準數 temp arr 0 遍歷陣...