[問題] QuickSort的問題

看板C_and_CPP作者 (秋天的風)時間14年前 (2010/03/04 20:36), 編輯推噓5(507)
留言12則, 4人參與, 最新討論串1/2 (看更多)
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) QuickSort當有重複值時出問題,程式停住 希望得到的正確結果: 希望QuickSort能跑出正確的排序結果 程式跑出來的錯誤結果: 多次的試驗發現,當10個數中沒有相同值的時候程式可以跑 但如果有相同值就不動了= = 找了很久卻搞不清楚問題出在哪裡.... 希望版友們幫忙解惑... 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) C++ 有問題的code: (請善用置底文標色功能) #include <iostream> #include <time.h> #define MAX 10 int A[10]={0}; void RandomNum() //產生10個亂數值之副程式 { int i; srand((unsigned)time(NULL)); //亂數值初始化 printf("產生10個亂數值:"); for (i = 0; i < MAX; i++) { A[i] = rand() % 90+10; //產生10~99的整數亂數值 printf("%4d",A[i]); } } void QuickSort(int A[], int left, int right) { int i, j,temp,pivot; //s = A[(left+right)/2]; i = left; j = right; pivot=A[left]; //指標設定於左邊起始點 if(i < j) { while(i<j) //當i在j左方時 { while(A[i] < pivot) { i++; // i向右找大於pivot者 if(i> MAX-2) break; } while(A[j] >pivot) { j--; // j向左找小於pivot者 if(j< 1) break; } if(i < j) { //交換A[i]與A[j] temp = A[i]; A[i] = A[j]; A[j] = temp; } } //交換pivot與A[j] temp=A[j]; A[j]=pivot; pivot=temp; QuickSort(A, left, j-1); // 對左邊進行遞迴 QuickSort(A, j+1, right); // 對右邊進行遞迴 } } void PrintQuickSort(int A[], int n) { printf("排序10個亂數值:"); for (int i = 0; i < n; i++) { printf("%4d",A[i]); } } int main() //主程式 { RandomNum(); //呼叫產生10個亂數值的副程式 printf("\n"); QuickSort(A, 0, MAX-1); //呼叫快速排序法的副程式 PrintQuickSort(A, MAX); //呼叫快速排序後的結果之副程式 printf("\n"); //system("PAUSE"); return(0); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.122.76.177

03/04 21:10, , 1F
逐步執行debug看看
03/04 21:10, 1F

03/04 21:19, , 2F
你怎麼pivot都是用變數存起來呢? 通常是用A[left]當作
03/04 21:19, 2F

03/04 21:21, , 3F
pivot, 然後i = left + 1; 要跟"真正"的pivot交換才有
03/04 21:21, 3F

03/04 21:22, , 4F
意義, 之後i、j要再往前一步, 內層迴圈不用判斷邊界,
03/04 21:22, 4F

03/04 21:31, , 5F
確保 i < j 即可
03/04 21:31, 5F

03/04 21:37, , 6F
上面i、j再往前是在A[i]、A[j]交換之後
03/04 21:37, 6F

03/04 21:41, , 7F
把pivot存起來會影響程式嗎? 剛改成不存好像沒影響...
03/04 21:41, 7F

03/04 21:52, , 8F
你逐步執行就會發現pivot的值會複製滿陣列, 重要的不
03/04 21:52, 8F

03/04 21:54, , 9F
是結果阿...
03/04 21:54, 9F

03/05 00:47, , 10F
謝謝大家的回覆 我了解囉 quicksort真是夠詭異...
03/05 00:47, 10F

03/05 02:01, , 11F
詭異!?不至於吧, 再說也可以不用自己寫....
03/05 02:01, 11F

03/05 02:02, , 12F
http://0rz.tw/tR11X stdlib裡就有qsort()可用了XD
03/05 02:02, 12F
文章代碼(AID): #1BZwb9oX (C_and_CPP)
文章代碼(AID): #1BZwb9oX (C_and_CPP)