[問題] 利用遞迴函式寫快速排序法

看板C_and_CPP (C/C++)作者 (etyiting)時間17年前 (2009/06/24 14:40), 編輯推噓3(307)
留言10則, 2人參與, 最新討論串1/1
這是期末作業, 死線是今天 問了一堆人他們都直接丟給我網路上找到的程式碼 嗯, 是看得懂, 但自己想照著原理寫一次 研究幾天了還是不知道自己寫的哪裡不對...... 我自己用Dev-C++編譯並執行是跑出這樣的結果 將41 24 76 11 45 64 21 69 19 36排序: 11 19 21 24 36 41 64 45 69 76 就是後半段沒有排完的樣子 而我給另一個同學同樣是用Dev-C++卻是根本跑不出結果然後就當掉了 時間緊迫無法再仔細研究, 只好貼上來 麻煩各位高手幫忙了 #include<iostream> using namespace std; void sorting(int array[], int i,int j) { int s, f, x; if(i<j) { s=i; f=j; x=*(array+s); //記錄軸及頭尾索引 while(i<j) { while(x>=*(array+i)) i++; //往右找直到找到大於x的數 while(x<=*(array+j)) j--; //往左找直到找到小於x的數 if(i>=j) break; int temp1; //交換 temp1 = *(array+i); *(array+i) = *(array+j); *(array+j) = temp1; } *(array+s) = *(array+j); *(array+j) = x; //將軸與j交換 sorting(array, s, j-1); //左邊進行遞迴 sorting(array, j+1, f); //右邊進行遞迴 } } int main() { int number[10]={41,24,76,11,45,64,21,69,19,36}; cout << "將" ; for(int k=0;k<=9;k++) cout << number[k] << '\t'; cout << "排序:" << endl; sorting(number, 0, 9); for(int k=0;k<=9;k++) cout << number[k] << '\t'; system("pause"); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 115.43.139.152

06/24 14:47, , 1F
while(x>=*(array+i) && i>=s) i++; 這要達到啥效果?
06/24 14:47, 1F

06/24 14:55, , 2F
以i為索引往右找直到找到比軸(s)大的為止
06/24 14:55, 2F

06/24 14:58, , 3F
啊推文打錯了是x, 也就是開始時左邊的數
06/24 14:58, 3F

06/24 14:58, , 4F
             最
06/24 14:58, 4F

06/24 14:59, , 5F
i 啥時會 < s?
06/24 14:59, 5F
發現i>=s和j<=f的條件似乎沒有必要, 感謝 ※ 編輯: etyiting 來自: 115.43.139.152 (06/24 15:07)

06/24 15:21, , 6F
但輸出結果還是一樣...
06/24 15:21, 6F

06/24 15:22, , 7F
若把函式呼叫自己的兩行拿掉, 會顯示第一次取軸及交換
06/24 15:22, 7F

06/24 15:23, , 8F
後 軸左邊的數比他小 右邊的數比他大 的結果
06/24 15:23, 8F

06/24 15:24, , 9F
如果 x 是最大的數會怎麼樣?
06/24 15:24, 9F

06/24 15:32, , 10F
原來如此, 問題解決了 謝謝!
06/24 15:32, 10F
文章代碼(AID): #1AGSfjzA (C_and_CPP)
文章代碼(AID): #1AGSfjzA (C_and_CPP)