之前說過軸的選擇是快速排序法的效率關鍵之一,在這邊的快速排序法的軸選擇方式更加快了 快速排序法的效率,它是來自演演算法名書 introduction to algorithms 之中。
先說明這個快速排序法的概念,它以最右邊的值s作比較的標準,將整個數列分為三個部份, 乙個是小於s的部份,乙個是大於s的部份,乙個是未處理的部份,如下所示 :
在排序的過程中,i 與 j 都會不斷的往右進行比較與交換,最後數列會變為以下的狀態:
然後將s的值置於中間,接下來就以相同的步驟會左右兩邊的數列進行排序的動作,如下所示:
整個演算的過程,直接摘錄書中的偽程式碼來作說明:
quicksort
(a, p, r)
if p < r
then q <
-partition
(a, p, r)
quicksort
(a, p, q-1)
quicksort
(a, q+
1, r)
end quicksort partition
(a, p, r)
x <
- a[r]
i <
- p-
1for j <
- p to r-1do
if a[j]
<= x
then i <
- i+
1exchange a[i]
<
->a[j]
exchange a[i+1]
<
->a[r]
return i+
1end partition
乙個實際例子的演算如下所示:
("排序前:");
for(i =
0; i < max; i++
)quicksort
(number,
0, max-1)
;printf
("\n排序後:");
for(i =
0; i < max; i++
)printf
("%d "
, number[i]);
printf
("\n");
return0;
}int
partition
(int number,
int left,
int right)
}swap
(number[i+1]
, number[right]);
return i+1;
}void
quicksort
(int number,
int left,
int right)
}
C 經典演算法題 合併排序法
之前所介紹的排序法都是在同乙個陣列中的排序,考慮今日有兩筆或兩筆以上的資料,它可能是不同陣列中的資料,或是不同檔案中的資料,如何為它們進行排序?可以使用合併排序法,合併排序法基本是將兩筆已排序的資料合併並進行排序,如果所讀入的資料尚未排序,可以先利用其它的排序方式來處理這兩筆資料,然後再將排序好的這...
C 經典演算法題 基數排序法
在之前所介紹過的排序方法,都是屬於 比較性 的排序法,也就是每次排序時 都是比較整個鍵值的大小以進行排序。這邊所要介紹的 基數排序法 radix sort 則是屬於 分配式排序 distribution sort 基數排序法又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過...
C 排序演算法 快速排序法
在閱讀此博文前,請先閱讀我的博文 排序演算法 基類設計 以了解基類的結構。在編寫 前,我們先來了解二路歸併法的排序過程 假設有乙個ilist型的集合list 集合的元素為list 0 到list n 1 n list.count 第1步 從a 0 n 1 中選擇乙個元素作為middle,該元素為支點...