[問題] 關於quick_sort的問題

看板C_and_CPP (C/C++)作者 (陽光棕梠)時間13年前 (2013/02/23 18:49), 編輯推噓0(008)
留言8則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 排列完成後少了一個數字產生了一個不是在序列裡面的數 餵入的資料(Input): {4, 10, 11, 5, 8, 3, 29, 22, 2, 21} 預期的正確結果(Expected Output): {2, 3, 4, 5, 8, 10, 11, 21, 22, 29} 錯誤結果(Wrong Output): 排序前:4 10 11 5 8 3 29 22 2 21 排序後:134514384 29 22 21 11 10 8 5 4 3 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX 10 #define SWAP(x,y) {int t; t = x; x = y; y = t;} void quicksort(int[], int, int); int main(void) { int number[MAX] = {4, 10, 11, 5, 8, 3, 29, 22, 2, 21}; int i, num; srand(time(NULL)); printf("排序前:"); for(i = 0; i < MAX; i++) { //number[i] = rand() % 100; printf("%d ", number[i]); } quicksort(number, 0, MAX); printf("\n排序後:"); for(i = 0; i < MAX; i++) { printf("%d ", number[i]); } printf("\n"); return 0; } void quicksort(int number[], int left, int right) { int i; int j = right; if(left < right) { for(i = right; i > left; i--) { if(number[i] < number[left]) { SWAP(number[i], number[j]); j--; } } SWAP(number[left], number[j]); quicksort(number, left, j-1); // 對左邊進行遞迴 quicksort(number, j+1, right); // 對右邊進行遞迴 } } 補充說明(Supplement): 請問版上各位,錯誤在哪裡,已經找很久都找不到錯誤! 快要崩潰了! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.251.56.250

02/23 18:56, , 1F
留意 array 最後一個元素的 index 為 MAX - 1
02/23 18:56, 1F

02/23 22:24, , 2F
陣列的index是從0開始的 這點很容易忘記
02/23 22:24, 2F

02/24 09:28, , 3F
for(i = right; i > left; i--)這裡有問題
02/24 09:28, 3F

02/24 09:29, , 4F
阿不對,應該是前面quicksort(number, 0, MAX);這裡
02/24 09:29, 4F

02/24 09:30, , 5F
MAX-1才是最後一個元素,所以應該要把MAX改成MAX-1
02/24 09:30, 5F

02/24 15:01, , 6F
感覺quicksort內的for迴圈邏輯可能有問題,建議你檢查看看
02/24 15:01, 6F

02/24 17:06, , 7F
抱歉,我搞錯了,遞減的話邏輯是對的
02/24 17:06, 7F

02/25 19:48, , 8F
感謝l大的提醒好像就是MAX-1的問題
02/25 19:48, 8F
文章代碼(AID): #1HA9wvkK (C_and_CPP)
文章代碼(AID): #1HA9wvkK (C_and_CPP)