質問: ソートアルゴリズムについて質問です。 今ソートアルゴリズムのプログラムで 1を入力したら単純選択法、 ソートアルゴリズムについて質問です。 今ソートアルゴリズムのプログラムで 1を入力したら単純選択法、 2を入力したら単純交換法、 3を入力したら単純挿入法、 4を入力したら奇偶転置ソートでデータが処理されていくというのを作っています。 私は下の変数を用いて書きたいのですが奇偶転置ソートの場合全く分かりません。 下の変数は単純選択法、単純交換法、単純挿入法に使われている変数です。 下の変数を用いて奇偶転置ソートを書いて頂けませんか? data[max]; // ソートされるデータを入力する配列 long n; // データの件数を保持する変数
回答: > 言語はc言語です。 > また、指定している変数と他の変数を作って頂いても大丈夫です。 ああそうですか。了解です。 ・・・・・・でもよぉ。 正直言うと、「このテの問題」ってwikipedia見てコピペすれば終わりなんですよね(笑)。何で教えてgooに質問投稿するんだかサッパリ分からんです(笑)。 実の事言うと、皆が皆「どのアルゴリズムも完全に覚えてる」って事はないんですよ。それで実は「アルゴリズム辞典」とか種本があって、昔は皆それ使ってたのね(今も使ってる人はいるかも)。 ↓例えばこんなの: https://gihyo.jp/book/2018/978-4-7741-9690-9 今だと「困った時のwikipedia」です。随分とラクになったもんですよ。 ついでに言うと、日本のwikipediaの例示コードだと、動かない場合がある。そういう場合は左横にある「english」をクリックする(爆)。アメリカのwikipediaの方が色々と正確ですからね。日本版のコード使って動かない場合は大体英語版wikipediaに答えがあります。 宿題の答えの丸写しは良くない、って人もいますが、個人的には全然構わんと思っています。ただ、それは「質問投稿」とかじゃなくって、ちょっとはアタマを使う・・・まぁ、wikipediaから答え引っ張ってきて「アタマを使う」もクソもホントはねぇんだけど(笑)、もうちょっと要領良くなる/やるべきですね。 とか言うとnttレゾナントが困っちゃうか(笑)。 それはさておき。こんなカンジかなぁ。 /* ここから */ #include #include int* selection_sort(int n, int* data) { int i, j, m, tmp; for (i = 0; i < n; i++) { m = i; for (j = i + 1; j < n; j++) { if (data[j] < data[m]) { m = j; } } tmp = data[i], data[i] = data[m], data[m] = tmp; } return data; } int* bubble_sort(int n, int* data) { int i, j, tmp; for (i = 0; i < n - 1; i++) { for (j = 1; j < n - i; j++) { if (data[j] < data[j-1]) { tmp = data[j], data[j] = data[j - 1], data[j - 1] = tmp; } } } return data; } int* insertion_sort(int n, int* data) { int i, j, tmp; for (i = 1; i < n; i++) { tmp = data[i]; if (data[i - 1] > tmp) { j = i; do { data[j] = data[j - 1]; j--; } while (j > 0 && data[j - 1] > tmp); data[j] = tmp; } } return data; } int* odd_even_sort(int n, int* data) { int sorted = 0; int i, tmp; while (!sorted) { sorted = 1; for (i = 1; i < n - 1; i += 2) { if (data[i] > data[i + 1]) { tmp = data[i], data[i] = data[i + 1], data[i + 1] = tmp; sorted = 0; } } for (i = 0; i < n - 1; i += 2) { if (data[i] > data[i + 1]) { tmp = data[i], data[i] = data[i + 1], data[i + 1] = tmp; sorted = 0; } } } return data; } int* (*func[4])(int, int*) = {selection_sort, bubble_sort, insertion_sort, odd_even_sort}; int main(int argc, char** argv) { int n = argc - 1; int* data, i; char s[2]; if (n < 1) goto end; data = malloc(sizeof(int) * n); for (i = 0; i < n; i++) { data[i] = atoi(argv[i + 1]); } scanf("%1s%*[^\n]%*c", s); i = atoi(s); if ((i > 0) && (i < 5)) { data = (*func[i - 1])(n, data); for (i = 0; i < n; i++) { printf("%d ", data[i]); } printf("\n"); } else { goto end; } free(data); end: return exit_success; }