排序算法(5)—快速排序


  快速排序(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) 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM