[問題] Quicksort選mid為pivot出現問題

作者: superme7 (superme)   2021-04-18 14:57:41
開發平台(Platform): Win10
編譯器: GCC
額外使用到的函數庫(Library Used): 無
問題(Question):試著優化Quicksort,選mid為pivot和選end結果不同
,選end結果正確,mid卻無法sort,請各位幫我看看程式哪裡有錯
P.S. 註解處為選end為pivot
餵入的資料(Input):9 4 1 6 7 3 8 2 5
預期的正確結果(Expected Output):1 2 3 4 5 6 7 8 9
錯誤結果(Wrong Output): 未顯示
程式碼(Code):
#include <iostream>
using namespace std;
const int n = 9;
void swap(int &a, int &b)
{
int t = a;
a = b;
b = t;
}
int Partition(int *list, int front, int end)
{
int pivot = (front + end) / 2;
int i = front - 1;
int j = end + 1;
while (i < j)
{
do
i++;
while (list[i] <= list[pivot]);
do
j
作者: LPH66 (-6.2598534e+18f)   2021-04-18 15:42:00
你知道 Partition 是怎麼運作的嗎?我是指, 每一行做了什麼事使得最後得到什麼結果這些細節
作者: ucrxzero (RX-0)   2021-04-18 15:47:00
不是就是 樞點右邊都比他大 左邊都比他小然後遞迴下去 若找到越中間的樞點越好
作者: superme7 (superme)   2021-04-18 15:55:00
tace過code了用pivot = end實作過,但是不知道pivot = m為甚麼跑不出來
作者: ucrxzero (RX-0)   2021-04-18 15:57:00
你是不是在寫作業
作者: superme7 (superme)   2021-04-18 16:01:00
不是,這是我上網學的
作者: ucrxzero (RX-0)   2021-04-18 16:01:00
我幫你看一夏
作者: superme7 (superme)   2021-04-18 16:06:00
感謝U大
作者: ucrxzero (RX-0)   2021-04-18 16:22:00
找到了改一下條件while (i<j &&list[i] <= list[pivot]);while (i<j &&list[j] >= list[pivot]);但還是不對等等= =www.algolist.net/Algorithms/Sorting/Quicksort
作者: ko27tye (好滋好滋)   2021-04-18 19:38:00
你要這樣做的話 partition function內的 最外層swap不要做 然後把i和j傳出去給quickSort當pivot
作者: ucrxzero (RX-0)   2021-04-18 19:42:00
對 ko27跟我查到的是一樣的方式
作者: superme7 (superme)   2021-04-18 22:06:00
感謝各位大大 我知道原因了
作者: ro9956882 (幽靈)   2021-04-24 02:42:00
pivot在end可行的話 多一行swap(list[mid],list[end])

Links booklink

Contact Us: admin [ a t ] ucptt.com