快速排序(Quick Sort)是冒泡排序的一種改進算法
基本思想:在當前的排序序列(K1,K2......Kn)中任意選取一個元素,把該元素稱為基准元素或支點,把小於等於基准元素的所有元素都移動到基准元素的前面,把大於基准元素的所有元素都移動到基准元素的后面,這樣使得基准元素的位置正好處於排序后的最終位置,並且把當前參加排序的序列分為前后兩個子序列,接下來分別對這兩個子序列重復上述操作,直至子序列長度為1。
舉例分析:設有一個數據元素序列{3,6,4,2,11,10,5},要求按從小到大順序排列,排序步驟如下圖所示:
快速排序元素間的比較次數較少,速度較快;在各種內部排序方法中,快速排序被認為是目前最好的一種排序方法,代碼如下所示(C#實現):
1 /// <summary> 2 /// 快速排序 3 /// </summary> 4 /// <param name="m_SourceArray">排序數組</param> 5 /// <param name="m_Start">排序起始位置</param> 6 /// <param name="m_End">排序結束位置</param> 7 /// <returns></returns> 8 public static int[] SortByQuickSort(int[] m_SourceArray,int m_Start,int m_End) 9 { 10 //序列長度大於1才需要進行排序 11 if (m_Start < m_End) 12 { 13 int i = m_Start; 14 int j = m_End; 15 //執行i++操作 16 while (m_SourceArray[m_Start] >= m_SourceArray[i] && i != m_End) 17 i++; 18 //執行j--操作 19 while (m_SourceArray[j] > m_SourceArray[m_Start] && j != 0) 20 j--; 21 if (i < j) 22 { 23 Swap(ref m_SourceArray[i], ref m_SourceArray[j]); 24 SortByQuickSort(m_SourceArray, m_Start, m_End); 25 } 26 else 27 { 28 //交換后完成一次划分 29 Swap(ref m_SourceArray[m_Start], ref m_SourceArray[j]); 30 //對划分左半部分進行排序 31 SortByQuickSort(m_SourceArray, m_Start, j - 1); 32 //對划分右半部分進行排序 33 SortByQuickSort(m_SourceArray, j+1, m_End); 34 } 35 } 36 return m_SourceArray; 37 } 38 39 /// <summary> 40 /// 交換兩個數 41 /// </summary> 42 /// <param name="m_Num1"></param> 43 /// <param name="m_Num2"></param> 44 public static void Swap(ref int m_Num1, ref int m_Num2) 45 { 46 int tmp; 47 tmp = m_Num1; 48 m_Num1 = m_Num2; 49 m_Num2 = tmp; 50 }
算法分析:快速排序屬於不穩定排序,時間復雜度為:O(N*logN)(感謝博友 LoveJenny、饕盡天下、Oscarzhao的指正),空間復雜度:O(1)