プロが教える店舗&オフィスのセキュリティ対策術

ソートアルゴリズムについて質問です。

今ソートアルゴリズムのプログラムで
1を入力したら単純選択法、
2を入力したら単純交換法、
3を入力したら単純挿入法、
4を入力したら奇偶転置ソートでデータが処理されていくというのを作っています。

私は下の変数を用いて書きたいのですが奇偶転置ソートの場合全く分かりません。

下の変数は単純選択法、単純交換法、単純挿入法に使われている変数です。

下の変数を用いて奇偶転置ソートを書いて頂けませんか?

data[MAX]; // ソートされるデータを入力する配列
long n; // データの件数を保持する変数

質問者からの補足コメント

  • すいません、コメント欄を見て記入漏れがあることに気づきました。
    指摘してくださりありがとうございます。

    言語はC言語です。

      補足日時:2020/08/24 09:45
  • また、指定している変数と他の変数を作って頂いても大丈夫です。

      補足日時:2020/08/24 09:47

A 回答 (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;
}
    • good
    • 1
この回答へのお礼

コードを書いて頂きありがとうございました。わざわざ教えて!gooに投稿したのはどんなプログラムが見れるかというような調査をしていたためです。
とても分かりやすかったです。
勉強になりました。
ありがとうございました。

お礼日時:2020/08/24 15:51

ちなみに、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))
    • good
    • 1
この回答へのお礼

わざわざはpythonで書いて頂きありがとうございます。

お礼日時:2020/08/24 15:48

えっと。

。。
各方式の処理アルゴリズムはわかっていて、具体的に入力されたデータをどう比較し、どう動かして並べ替えるのか設計できているのでしょうか?
単に各ソート方法の基本的な考え方を知っているだけで、いきなりプログラミング言語を使ってソースプログラムを書き始めているのだとしましたら、出来ない原因は「設計をしていないから」です。

そもそも変数は・・・

> data[MAX]; // ソートされるデータを入力する配列
> long n; // データの件数を保持する変数

・・・の二つで足りるという確証があってコーディングされていますか?
参考まで。
    • good
    • 1

何の言語ですか?


場合によっては投稿カテゴリを間違えてるかもしれませんよ。
    • good
    • 1
この回答へのお礼

指摘して頂きありがとうございます。

言語はC言語です。

お礼日時:2020/08/24 09:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!