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

看板C_and_CPP作者 (Bonbodi)時間3年前 (2021/04/18 14:57), 編輯推噓9(9012)
留言21則, 5人參與, 3年前最新討論串1/1
開發平台(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--; while (list[j] >= list[pivot]); swap(list[i], list[j]); } swap(list[pivot], list[i]); return i; } /*int Partition(int *list, int front, int end) { int i = front - 1; for (int j = front; j < end; j++) { if (list[j] < list[end]) { swap(list[++i], list[j]); } } swap(list[++i], list[end]); return i; }*/ void Quicksort(int *list, int front, int end) { if (front < end) { int pivot = Partition(list, front, end); Quicksort(list, front, pivot - 1); Quicksort(list, pivot + 1, end); } } void Print(int *list) { for (int i = 0; i < n; i++) cout << list[i] << " "; cout << endl; } int main() { int a[] = {9, 4, 1, 6, 7, 3, 8, 2, 5}; cout << "Unsorted: \n"; Print(a); cout << "Sorted: \n"; Quicksort(a, 0, n - 1); Print(a); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.136.218 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1618729063.A.8D4.html

04/18 15:42, 3年前 , 1F
你知道 Partition 是怎麼運作的嗎?
04/18 15:42, 1F

04/18 15:42, 3年前 , 2F
我是指, 每一行做了什麼事使得最後得到什麼結果這些細節
04/18 15:42, 2F

04/18 15:47, 3年前 , 3F
不是就是 樞點右邊都比他大 左邊都比他小
04/18 15:47, 3F

04/18 15:48, 3年前 , 4F
然後遞迴下去 若找到越中間的樞點越好
04/18 15:48, 4F

04/18 15:55, 3年前 , 5F
tace過code了用pivot = end實作過,但是不知道pivot = m
04/18 15:55, 5F

04/18 15:56, 3年前 , 6F
為甚麼跑不出來
04/18 15:56, 6F

04/18 15:57, 3年前 , 7F
你是不是在寫作業
04/18 15:57, 7F

04/18 16:01, 3年前 , 8F
不是,這是我上網學的
04/18 16:01, 8F

04/18 16:01, 3年前 , 9F
我幫你看一夏
04/18 16:01, 9F

04/18 16:06, 3年前 , 10F
感謝U大
04/18 16:06, 10F

04/18 16:22, 3年前 , 11F
找到了改一下條件
04/18 16:22, 11F

04/18 16:22, 3年前 , 12F
while (i<j &&list[i] <= list[pivot]);
04/18 16:22, 12F

04/18 16:22, 3年前 , 13F
while (i<j &&list[j] >= list[pivot]);
04/18 16:22, 13F

04/18 16:25, 3年前 , 14F
但還是不對
04/18 16:25, 14F

04/18 16:25, 3年前 , 15F
等等= =
04/18 16:25, 15F

04/18 17:22, 3年前 , 16F
www.algolist.net/Algorithms/Sorting/Quicksort
04/18 17:22, 16F

04/18 19:38, 3年前 , 17F
你要這樣做的話 partition function內的 最外層swap不要
04/18 19:38, 17F

04/18 19:38, 3年前 , 18F
做 然後把i和j傳出去給quickSort當pivot
04/18 19:38, 18F

04/18 19:42, 3年前 , 19F
對 ko27跟我查到的是一樣的方式
04/18 19:42, 19F

04/18 22:06, 3年前 , 20F
感謝各位大大 我知道原因了
04/18 22:06, 20F

04/24 02:42, 3年前 , 21F
pivot在end可行的話 多一行swap(list[mid],list[end])
04/24 02:42, 21F
文章代碼(AID): #1WUzXdZK (C_and_CPP)