C 經典演算法題 快速排序法(三)

2021-10-02 06:24:24 字數 2025 閱讀 6186

之前說過軸的選擇是快速排序法的效率關鍵之一,在這邊的快速排序法的軸選擇方式更加快了 快速排序法的效率,它是來自演演算法名書 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,該元素為支點...