- ベストアンサー
クイックソートでの降順整列プログラム作成
- キーボードから入力された10個~20個程度の数列をクイックソートによって降順に整理するプログラムを作成する方法を教えてください。
- 授業中に教わった2つのプログラムを応用して実装を試みましたが、エラーが多く発生しています。どのように修正すれば良いでしょうか?
- ヒントをいただけると助かります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
この「プログラム」を渡されたのなら, 渡した人に「本当にこれで動いているのか」とでも聞いてください. どんなエラーメッセージが出るのか知りたいところではあるけど....
その他の回答 (3)
- cortotbach
- ベストアンサー率44% (8/18)
人身事故で電車が止まったので、その暇つぶしで。 とはいえこれじゃ勉強にならないですね。 C++なのでご留意ください。 // クイックソート // 実行の仕方: XXXXX.exe 5 50 20 10 40 30 // 5 = 5個のデータをソートする // 50 20 10 40 30 = 5個のデータの実体 #include <cstdio> #include <cstdlib> #define MAX_DATA_ARRAY_SIZE (100) // ソート関数 int quick_sort(int data[], const int startIndex, const int endIndex); // プログラムの実行の仕方の表示 int showUsage() { printf("usage : HOGEHOGE.exe 5 50 20 10 40 30\n"); printf("5 = number of sorting data\n"); printf("10 20 30 40 50 = sorting data\n"); return 1; } int main(int argc, char** argv) { // プログラム実行引数の表示 printf("program arguments...\n"); printf("argc = %d\n", argc); for(int i = 0; i < argc; i++) { printf("[%d] = %s\n", i, argv[i]); } // プログラム実行引数の数の確認 if(argc <= 3) { printf("error 1\n"); // 引数は4個以上必要 // 1個目argv[0]:実行パス // 2個目argv[1]:ソートするデータの数 // 3個目以降argv[2]......:ソートするデータ列(最低1個は必要) ::showUsage(); // プログラムの実行の仕方を表示 return 0; // エラーなので終了 } // ソートするデータの数の取得(プログラム実行引数の最初の数字を取得) int numOfData = atoi(argv[1]); if(numOfData == 0) { printf("error 2\n"); return 0; } else if(numOfData != argc - 2) { printf("error 3\n"); return 0; } else if(numOfData >= MAX_DATA_ARRAY_SIZE) { printf("error 4\n"); return 0; } // ソートすべきデータ(配列) int data[MAX_DATA_ARRAY_SIZE]; // ソートすべきデータの取得 for(int i = 0; i < numOfData; i++) { int result = sscanf(argv[2 + i], "%d", &data[i]); if(result == 0) // エラー { printf("error 5\n"); return 0; } printf("data[%d] = %d\n", i, data[i]); } // クリックソート ::quick_sort(data, 0, numOfData - 1); printf("sorting...\n"); // 結果の表示 for(int i = 0; i < numOfData ; i++){ printf("sorted data[%d] = %d\n", i, data[i]); } return 1; } // クイックソート // データ配列(data[])を、data[leftIndex]からdata[rightIndex]まで並べ替え int quick_sort(int data[], const int leftIndex, const int rightIndex) { int i = leftIndex; int j = rightIndex; int pivot = data[(leftIndex + rightIndex) / 2]; while (1) { while (data[i] < pivot) { i++; } while (pivot < data[j]) { j--; } if (i >= j) { break; } int temp = data[i]; data[i] = data[j]; data[j] = temp; i++; j--; } if (leftIndex < i - 1) { ::quick_sort(data, leftIndex, i - 1); } if (j + 1 < rightIndex) { ::quick_sort(data, j + 1, rightIndex); } return 1; }
- cortotbach
- ベストアンサー率44% (8/18)
これからの期末に向けてこういった質問は増えそうですね。 この2つのソースは#1,#2さんと同様にかなり酷いです。 もし先生・教授がヒントとして提示したソースなら授業を放棄してもよい位酷いソースです(Cの文法をしっかりと理解していない方の様です)。あと1.c, 2.cとなっていますが、おそらく2つではないのでは?1つのCのソースにまとめて書くべき書き方をしています。とはいえこれは酷いなぁ・・。 まずは、この2つのソース(先生ではなく、友達あたりだと信じたいですが)を提供された方に、もう少しまともなソースを下さいと行った方が良いかもしれないですね。 また、回答に関しては、ソートというのは大変良くある事例ですのでウェブなり図書館にいってC言語+ソートで調べればたくさん答えが見つかると思いますよ。
- Wr5
- ベストアンサー率53% (2173/4061)
基本的には#1さんの回答通りですが… ざっと見て。 >main(int argc, char *argv) 関数の戻り値の型もちゃんと書きましょう。 >n = atoi(argv[1]); 起動時にコマンドライン引数が渡されていないと、たぶんアクセス違反(またはSegmentation Fault)で落ちる。 >for(i = 0;i< n;i++); 空ループです。 セミコロンは不要かと。 >scanf("%d", %x[i]); %ではなく&では? また、コマンドライン引数で"101"以上を指定するとバッファオーバーフローです。 >quick_sort(x, n); 引数の数が合っていません。