ソートアルゴリズムについて質問です。
今ソートアルゴリズムのプログラムで
1を入力したら単純選択法、
2を入力したら単純交換法、
3を入力したら単純挿入法、
4を入力したら奇偶転置ソートでデータが処理されていくというのを作っています。
私は下の変数を用いて書きたいのですが奇偶転置ソートの場合全く分かりません。
下の変数は単純選択法、単純交換法、単純挿入法に使われている変数です。
下の変数を用いて奇偶転置ソートを書いて頂けませんか?
data[MAX]; // ソートされるデータを入力する配列
long n; // データの件数を保持する変数
No.4ベストアンサー
- 回答日時:
> 言語はC言語です。
> また、指定している変数と他の変数を作って頂いても大丈夫です。
ああそうですか。了解です。
・・・・・・でもよぉ。
正直言うと、「このテの問題」ってWikipedia見てコピペすれば終わりなんですよね(笑)。何で教えてgooに質問投稿するんだかサッパリ分からんです(笑)。
実の事言うと、皆が皆「どのアルゴリズムも完全に覚えてる」って事はないんですよ。それで実は「アルゴリズム辞典」とか種本があって、昔は皆それ使ってたのね(今も使ってる人はいるかも)。
↓例えばこんなの:
https://gihyo.jp/book/2018/978-4-7741-9690-9
今だと「困った時のWikipedia」です。随分とラクになったもんですよ。
ついでに言うと、日本のWikipediaの例示コードだと、動かない場合がある。そういう場合は左横にある「English」をクリックする(爆)。アメリカのWikipediaの方が色々と正確ですからね。日本版のコード使って動かない場合は大体英語版Wikipediaに答えがあります。
宿題の答えの丸写しは良くない、って人もいますが、個人的には全然構わんと思っています。ただ、それは「質問投稿」とかじゃなくって、ちょっとはアタマを使う・・・まぁ、Wikipediaから答え引っ張ってきて「アタマを使う」もクソもホントはねぇんだけど(笑)、もうちょっと要領良くなる/やるべきですね。
とか言うとNTTレゾナントが困っちゃうか(笑)。
それはさておき。こんなカンジかなぁ。
/* ここから */
#include <stdio.h>
#include <stdlib.h>
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;
}
コードを書いて頂きありがとうございました。わざわざ教えて!gooに投稿したのはどんなプログラムが見れるかというような調査をしていたためです。
とても分かりやすかったです。
勉強になりました。
ありがとうございました。
No.3
- 回答日時:
ちなみに、Pythonで書いたらこんなカンジですかね。
## ここから
#!/usr/bin/env python
import sys
def selection_sort(data):
for i in range(len(data)):
m = i
for j in range(len(data[1:])):
if data[j] > data[m]:
m = j
data[i], data[m] = data[m], data[i]
return data
def bubble_sort(data):
for i in range(len(data)):
for j in range(1, len(data)):
if data[j] < data[j - 1]:
data[j], data[j - 1] = data[j - 1], data[j]
return data
def insertion_sort(data):
for i in range(1, len(data)):
tmp = data[i]
if data[i - 1] > tmp:
j = i
while (j > 0) and (data[j - 1] > tmp):
data[j] = data[j - 1]
j -= 1
data[j] = tmp
return data
def odd_even_sort(data):
changed = True
while changed:
changed = False
for i in range(0, len(data) - 1, 2):
if data[i] > data[i + 1]:
data[i], data[i + 1] = data[i + 1], data[i]
changed = True
for i in range(1, len(data) - 1, 2):
if data[i] > data[i + 1]:
data[i], data[i + 1] = data[i + 1], data[i]
changed = True
return data
dict = {1 : selection_sort, 2 : bubble_sort, 3 : insertion_sort, 4 : odd_even_sort}
if __name__ == '__main__':
data = [int(i) for i in sys.argv[1:]]
print(dict[int(input())](data))
No.2
- 回答日時:
えっと。
。。各方式の処理アルゴリズムはわかっていて、具体的に入力されたデータをどう比較し、どう動かして並べ替えるのか設計できているのでしょうか?
単に各ソート方法の基本的な考え方を知っているだけで、いきなりプログラミング言語を使ってソースプログラムを書き始めているのだとしましたら、出来ない原因は「設計をしていないから」です。
そもそも変数は・・・
> data[MAX]; // ソートされるデータを入力する配列
> long n; // データの件数を保持する変数
・・・の二つで足りるという確証があってコーディングされていますか?
参考まで。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Excel(エクセル) 結合セルのソートについて 5 2022/04/22 11:57
- その他(パソコン・スマホ・電化製品) 挿入ソートとマージソートを比較すると,挿入ソートのほうが計算量は少なく,効率的なアルゴリズムである。 1 2022/11/30 17:31
- Excel(エクセル) Excelの50音順ソートを全ての行列に適用するには? 4 2022/12/05 11:28
- Excel(エクセル) Excel 関数 vlookupなどの使い方について質問です。 シート1に品番、商品名、単価、発注条 6 2022/06/15 19:16
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、写真のプログラムをどう直せ 2 2022/07/09 21:13
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- Java コンソールから所属財産を入力(単位:万円 1000~100000以内でIntegerに変換できない場 2 2022/05/31 21:32
- Excel(エクセル) 重複しているか否かをソートせずに判断する方法ありますか? 2 2022/07/06 21:16
- Excel(エクセル) Excelで全クラスのランキング表を作成したい 4 2022/05/24 15:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
データの値の近いものをグルー...
-
【Excel VBA】10進数を2進数に...
-
途中経過も表示するプログラム
-
エクセルVBA:日付データの変換...
-
matlabのソースコードをpython...
-
C言語の構造体にてバブルソート...
-
stable diffusionのエラー
-
C言語の勉強しています。すみま...
-
pythonでDBのカラム名で取得し...
-
オセロゲーム 2次元配列で困...
-
C言語についてです! 同じ年の...
-
python 気象データの取得
-
'dataType' 引数を Null にする...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
number 改行が追加できない
-
エクセルシート名の制限を変更...
-
ビットスワップとバイトスワッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
int型(2バイト)データの分割
-
c言語の多次元配列で1から100ま...
-
C#でのswitch文
-
【Excel VBA】10進数を2進数に...
-
途中経過も表示するプログラム
-
CreateProcessでの環境変数の設...
-
pythonでDBのカラム名で取得し...
-
C言語についてです! 同じ年の...
-
linuxのシェルでファイル名に先...
-
c言語 配列から数字だけをint型...
-
c言語での wavファイルの編集(...
-
matlabのソースコードをpython...
-
ビットデータのチェック方法
-
10個の実数に対する降順ソート...
-
python 気象データの取得
-
C言語の構造体にてバブルソート...
おすすめ情報
すいません、コメント欄を見て記入漏れがあることに気づきました。
指摘してくださりありがとうございます。
言語はC言語です。
また、指定している変数と他の変数を作って頂いても大丈夫です。