面試指南 - 請實現一個快速排序算法


 

  快速排序算法是諸多排序算法中性能較優的一種,也是很多內建排序類型所采用的算法。該算法在.NET面試和筆試中經常被考查到,下面將詳細介紹快速排序的算法思想及代碼示例。

 

所涉及的知識點:

  • 使用C#實現快速排序算法

 

分析問題:

  快速排序算法是公認的最為優秀的內部排序算法之一,其實實現思想很簡單,並且在一般情況下性能較高。下面是該算法的基本思想:

  1. 假設待排序的序列為L[m...n],其中L[m...midlle-1]中的每個元素都小於L[midlle],而L[midlle+1...n]中的每個元素都大於L[midlle]。
  2. 遞歸調用快速排序算法,對L[m...midlle-1]和L[midlle+1...n]分別進行排序。
  3. 由於是原地排序,所以遞歸結束后自然形成了有序序列。

 

  下列代碼給出了快速排序的一個實現示例:

 1 using System;
 2 
 3 namespace Guying.Demo.ConsoleApp
 4 {
 5     class QuickSort
 6     {
 7         static void Main(string[] args)
 8         {
 9             int[] data = new int[] { 1, 1, 4, 3, 6, 7, 4, 5, 0, 0 };  // 建立測試數組
10             Run(data, 0, data.Length - 1);  // 進行快速排序
11             for (int i = 0; i < data.Length; i++)
12                 Console.Write("{0}, ", data[i]);
13             Console.Read();
14         }
15 
16         /// <summary>
17         /// 快速排序算法
18         /// </summary>
19         /// <param name="data">排序數組</param>
20         /// <param name="low">排序下限</param>
21         /// <param name="high">排序上限</param>
22         static void Run(int[] data, int low, int high)
23         {
24             /**
25              * 簡單設定中間值,並以此為一趟快速排序的分割點
26              * 注意這里是一個簡單的算法
27              * 如果想對這個算法進行優化的話,可以采取隨機的方法來獲取分割點
28              * */
29             int middle = data[(low + high) / 2];
30 
31             int i = low, j = high;  // 設定移動上下標
32 
33             // 直至分割出兩個序列
34             do
35             {
36                 // 掃描中值左邊元素
37                 while (data[i] < middle && i < high) i++;
38                 // 掃描中值右邊元素
39                 while (data[j] > middle && j > low) j--;
40                 // 找到了一對可交換的值
41                 if (i <= j)
42                 {
43                     // 交換
44                     int temp = data[i];
45                     data[i] = data[j];
46                     data[j] = temp;
47                     i++;
48                     j--;
49                 }
50             } while (i <= j);
51             // 遞歸對比分割點元素都小的那個序列進行快速排序
52             if (j > low) Run(data, low, j);
53             // 遞歸對比分割點元素都大的那個序列進行快速排序
54             if (i < high) Run(data, i, high);
55         }
56     }
57 }

 

  編譯並執行上述代碼,可以得到如下結果:

 

說明:

  快速排序算法在最壞的情況下運行時間為O(n2),平均運行時間為O(nlgn)。快速排序的對象都讀入內存中,所以輸入內部輸入內部排序。

  快速排序基於比較關鍵字來確定元素的位置,所以它屬於比較排序。同時,快速排序具有原地排序特性和不穩定特性,這意味着快速排序不需要額外的排序空間,但是不能確保相等的元素位置不被交換。

 

答案:

  快速排序是最為高效的內部排序算法之一,其基本思想在於把排序對象分割為兩列子序列,而其中一個子序列的值都大於另一個子序列的值,並且進一步遞歸排序所有子序列。

 

 

 

 

 

《.NET程序員面試真題》學習筆記

 


免責聲明!

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



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