2010年8月6日 星期五

[C++ 演算法] 排序 : 快速排序法 (一)


轉載自 這裡(Gossip@Caterpillar)
前言 :
快速排序法(quick sort)是目前所公認最快的排序方法之一(視解題的對象而定),雖然快速排序法在最差狀況下可以達O(n2),但是在多數的情況下,快速排序法的效率表現是相當不錯的.
快速排序法的基本精神是在數列中找出適當的軸心,然後將數列一分為二,分別對左邊與右邊數列進行排序,而影響快速排序法效率的正是軸心的選擇.
這邊所介紹的第一個快速排序法版本,是在多數的教科書上所提及的版本,因為它最容易理解,也最符合軸心分割與左右進行排序的概念,適合對初學者進行講解.

解法 :
這邊所介紹的快速演算如下:
將最左邊的數設定為軸,並記錄其值為 s
廻圈處理:
1. 令索引 i 從數列左方往右方找,直到找到大於 s 的數
2. 令索引 j 從數列右方往左方找,直到找到小於 s 的數
3. 如果 i >= j,則離開迴圈
4. 如果 i < j,則交換索引i與j兩處的值
5. 將左側的軸與 j 進行交換
6. 對軸左邊進行遞迴
7. 對軸右邊進行遞迴


透過以下演算法,則軸左邊的值都會小於s,軸右邊的值都會大於s,如此再對軸左右兩邊進行遞迴,就可以對完成排序的目的,例如下面的實例,*表示要交換的數,[]表示軸:
* [41] 24 76* 11 45 64 21 69 19 36* (i:76>41, j:36<41)
* [41] 24 36 11 45* 64 21 69 19* 76 (i:45>41, j:19<41)
* [41] 24 36 11 19 64* 21* 69 45 76 (i:64>41, j:21<41)
* [41] 24 36 11 19 21 64 69 45 76 (i>j, 交換 41所在位置與i 的位置)
* 21 24 36 11 19 [41] 64 69 45 76


在上面的例子中,41左邊的值都比它小,而右邊的值都比它大,如此左右再進行遞迴至排序完成.

演算法範例代碼 :
* SortQuick1.h 代碼 :
  1. #include "main.h"  
  2. #include "Basic.h"  
  3.   
  4. #define MAX_SORT_QUICK1_LEN 10  
  5.   
  6. /* 
  7. * Source : http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/QuickSort1.htm 
  8. */  
  9. void quickSort(int num[], int len);  
  10. void _quickSort(int num[], int left, int right, int len);  
* SortQuick1.cpp 代碼 :
  1. #include "SortQuick1.h"  
  2.   
  3. void quickSort(int num[], int len) {  
  4.     _quickSort(num, 0, len-1, len);  
  5. }  
  6.   
  7. void _quickSort(int num[], int left, int right, int len) {  
  8.     if(left < right) {  
  9.         int i = left;  
  10.         int j = right +1;  
  11.         while(1) {  
  12.             //向右找  
  13.             while(i+1< len && num[++i] < num[left]);  
  14.             //向左找  
  15.             while(j-1>-1 && num[--j] > num[left]);  
  16.             if(i>j)  
  17.                 break;  
  18.             SWAP(num[i], num[j]);  
  19.         }  
  20.         SWAP(num[left], num[j]);  
  21.         _quickSort(num, left, j-1, len);  
  22.         _quickSort(num, j+1, right, len);  
  23.     }  
  24. }  

執行結果 :
Generate random Int array:
98 26 17 15 44 66 42 28 5 52
Original Array:
98 26 17 15 44 66 42 28 5 52
After Quick1 Sorting:
5 15 17 26 28 42 44 66 98 52
This message was edited 6 times. Last update was at 24/05/2010 10:03:10

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...