C#實現快速排序


網上很多關於快速排序的教程,嗯,不錯,版本也很多,有的試了一下還報錯。。呵呵

於是乎低智商的朕花了好幾天廢了8張草稿紙才弄明白。。

 

快速排序的采用的分治啊挖坑填數啊之類的網上到處都是,具體過程自己百度吧,這里就講講我自己寫的代碼。還有,快排是一種不穩定的排序算法,就是說,當整個數列是無序狀態時,效率高,但是,當把一個從大到小的通過排序轉成從小到大的,那就呵呵了,隨時StackOverflow。。

 

OK,先上代碼(排序結果是從小到大)

 1         static void QuickSort(int[] num, int left, int right)
 2         {
 3             if (left >= right)
 4                 return;
 5 
 6             int key = num[left];
 7             int i = left;
 8             int j = right;
 9 
10             while (i < j)
11             {
12                 while (i < j && key < num[j])
13                     j--;
14                 if (i >= j)
15                 {
16                     num[i] = key;
17                     break;
18                 }
19                 num[i] = num[j];
20 
21                 while (i < j && key >= num[i])
22                     i++;
23                 if (i >= j)
24                 {
25                     num[i] = key;
26                     break;
27                 }
28                 num[j] = num[i];
29             }
30             num[i] = key;
31 
32             QuickSort(num, left, i - 1);
33             QuickSort(num, i + 1, right);
34         }

參數中的num就不用說了吧,left和right分別代表排序待排序數組的開始和結尾的索引,當然默認排序整個數組的話就:

QuickSort(a, 0, a.Length - 1);

假設待排序數組是a,排序索引是0到最后一項的元素。

 

快排使用分治,選取一個關鍵值key(代碼中的第6行,並且默認使用待排序數組的第一個值),把比它大的和比它小的分別放在兩邊。

具體就是先從數組右邊(j值記錄的索引)開始找比key小的數,對應代碼的12、13行,至於為什么要i < j,呵呵,待會兒說。

循12行環的意義是,如果當前num[j]比key大,j就自減,直到key>num[j]就找到了比key小或相等的數了唄。

又由於排序的數千變萬化,所以有的情況下j一路減下去或記錄左邊索引的i一路加上去,就有可能i>=j,於是就有了10、12、14、21、23行判斷i和j關系的語句了,因為如果i都>=j了,就表示分完了啊。

 於是先假設i一直<j,通過12行的循環找到了比key小或等於的值,就把左右的數交換,不用擔心key不見,因為有第6行。。

之后又通過21行的循環找比key大的值,再在28行交換。這樣下來10行的大循環完了之后,數組就留了一個“空位”(這個“空位”當然有數,只是它應該被key填充),再在30行用key填充。

之后31、32行遞歸(別說你不知道啥意思),再對key兩邊的數進行排序。

排序完成后,i值就對應key的索引,所以遞歸調用的參數就那樣填。。

 

以上純屬個人理解,有錯誤的地方還請指出!


免責聲明!

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



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