クイックソートの実装をしようとしています。
実行時にエラー(atcoderのコードテストだと終了コード139)になるのですが、エラー文が出てこず、原因(どこをどう直せばよいか)が分かりません。
環境はwindowsでエディターとしてVScodeを使用しています。
コードは以下の通りで、main直前の「quick_sort(A+j, n);」をコメントアウトすると正しくソートはできていないものの、終了はする(printfが実行されている)ので問題は「quick_sort(A+j, n);」にあるのではないかと考えています。
不足している情報や不明点があれば追記しますので指摘してください。
よろしくお願いします。
GCC
1#include <stdio.h> 2#include <assert.h> 3 4// 素数 5#define N 2999 6 7int A[N]; 8 9// *p と *q の値を入れ替える関数 10void swap(int *p, int *q){ 11 int tmp; 12 tmp = *p; 13 *p = *q; 14 *q = tmp; 15} 16 17 18/* 19A[0], A[1], ..., A[n-1] の中でk+1番目に小さい値を返す関数 20ただし、Aの中身は書き換えてしまう。 21*/ 22 23void quick_sort(int A[], int n){ 24 int i, j, pivot; 25 26 if (n > 1){ 27 // 真ん中の要素をピボットとする 28 pivot = A[n/2]; 29 A[n/2] = A[0]; 30 A[0] = pivot; 31 32 for(i = j = 1; i < n; i++){ 33 //pivot以下の数字をA[i]からA[j-1]に集約 34 if (A[i] <= pivot){ 35 swap(A+i, A+j); 36 j++; 37 } 38 } 39 40 //pivotと一致するものを中心に寄せる 41 //pivot=3なら[2, 1, 2, 3, 3, 3, …, 3, 3, 5, 6, 5, 7]のようにする 42 int x, y, piv_num; // x:走査用, y;置換用 43 piv_num = 0; 44 45 for (x = y = j-1; x>=0; x--){ 46 if (A[x] == pivot){ 47 swap(A+x, A+y); //位置xにあったpivotに一致する数字を位置yに寄せる 48 y--; 49 piv_num++; 50 } 51 } 52 53 //A[j-piv_num]からA[j-1]までの連続したpiv_num個がpivotと一致する数字 54 quick_sort(A+0, j-piv_num); 55 quick_sort(A+j, n); 56 } 57} 58 59int main(){ 60 int i; 61 A[0] = 0; 62 A[1] = 17; //原始元 63 for(i=2;i<N;i++){ 64 A[i] = (long long int) A[i-1] * A[1] % N; 65 } 66 67// すべての要素が同じ場合でも計算が早く終わるか確認する 68 69 quick_sort(A, N); 70 for(i=0;i<N;i++){ 71 if(A[i] != i) printf("ERROR %dth element is %d\n", i, A[i]); 72 } 73} 74
回答2件
あなたの回答
tips
プレビュー