質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

4回答

3918閲覧

配列が昇順または降順にソートされているか調べる

iWant2Die

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/12/25 11:13

配列が昇順または降順にソートされているか調べる
例えば、int a[]={1,2,3,4,5}は昇順にソートされていることは明らか。どうやって明らかでない配列に対してそのことを確認する?

c

1int main(void) {int a[]={1,2,3,4,5},b[]={-2,4,3,-3,5};}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2021/12/25 11:16

ソートかけて置換が発生しなかったらok てのは?
YT0014

2021/12/26 00:35

前提条件を明示してください。 ない場合は、ソートされていない場合、及び、要素が1以下の場合、全要素が同一値の場合の仕様を検討する必要があります。
fana

2021/12/27 01:12

> 例えば、int a[]={1,2,3,4,5}は昇順にソートされていることは明らか 「明らか」とか言ってるけども,あなたはどうやって「ソートされている」と 判断/判定 したというのか? それが「ソートされているか否かを調べる方法」足り得るのでは?
guest

回答4

0

配列の最初から最後までスキャンして、昇順、降順をチェックしましょう。

投稿2021/12/25 11:56

編集2021/12/25 11:57
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

要素数Nの配列:a[N]に対し

  • N=1なら ソートされている。
  • 任意の i = 1, 2, 3 ... N-1 (N>1) に対し a[i-1] <= a[i] であれば 昇順でソートされている。
  • 任意の i = 1, 2, 3 ... N-1 (N>1) に対し a[i-1] >= a[i] であれば 降順でソートされている。

投稿2021/12/25 11:44

編集2021/12/25 11:52
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

order は、昇順なら 1、降順なら -1、どちらでもなければ 0 を返す関数です。

C

1#include <stdio.h> 2 3int order(int a[], int n) 4{ 5 int ascend = 0, descend = 0; 6 for (int i = 1; i < n; i++) { 7 if (a[i-1] < a[i]) ascend = 1; 8 if (a[i-1] > a[i]) descend = 1; 9 if (ascend && descend) return 0; 10 } 11 return descend ? -1 : ascend; 12} 13 14int main(void) 15{ 16 int a[] = {1,2,3,4,5}, b[] = {-2,4,3,-3,5}; 17 int c[] = {9,8,7,6,5}, d[] = {3,3,3,3,3}, e[] = {7}; 18 printf("%d\n", order(a, 5)); 19 printf("%d\n", order(b, 5)); 20 printf("%d\n", order(c, 5)); 21 printf("%d\n", order(d, 5)); 22 printf("%d\n", order(e, 1)); 23}

実行結果

text

11 20 3-1 40 50

追記
全部同じ値の時は 0 を、昇順と降順の両方阿ある時は 2 を返すようにするには
for文の中の return 0;return 2; にすればよいでしょう。

追記2
昇順でも降順でもどちらでもいいし、値が全部同じでもソートされているとして 1を返すなら、
for文の中の return 0; はそのままで、最後を return 1; にすればよいでしょう。

投稿2021/12/25 14:06

編集2021/12/25 14:27
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

配列がソートされているかどうかを判定する関数is_sorted()を書いてみた。
引数は標準ライブラリ関数qsort()と同一である。
なお、nmembが1以下のときはソートされているとみなす。

C

1int is_sorted( 2 void *base, 3 size_t nmemb, 4 size_t size, 5 int (*compar)(const void *, const void *)) 6{ 7 if (nmemb){ 8 for (const char *p = (const char *)base; --nmemb; p += size){ 9 if (compar(p, p + size) > 0){ 10 return 0; 11 } 12 } 13 } 14 15 return 1; 16}

2021/12/26 追記
kazuma-sさん 2021/12/25 23:07 のコメントを受け、上記の関数is_sorted()を元に
配列が昇順/降順かを判定する関数is_monotonic()を書いてみた。
この関数は、配列が昇順または全ての値が等しければ1を、降順であれば-1を、そうでなければ0を返す。
なお、nmembが1以下のときは1を返す。

C

1int is_monotonic( 2 void *base, 3 size_t nmemb, 4 size_t size, 5 int (*compar)(const void *, const void *)) 6{ 7 int order = 0; 8 9 if (nmemb < 2){ 10 return 1; 11 } 12 13 for (const char *p = (const char *)base; --nmemb; p += size){ 14 int comparison_result = compar(p, p + size); 15 16 if ((order < 0 && comparison_result > 0) 17 || (order > 0 && comparison_result < 0)){ 18 return 0; 19 } 20 21 if (order == 0){ 22 order = comparison_result; 23 } 24 } 25 26 if (order < 0){ 27 return -1; 28 } 29 30 return 1; 31} 32

投稿2021/12/25 12:50

編集2021/12/26 02:17
shsh_

総合スコア113

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuma-s

2021/12/25 14:07

降順にソートされている場合 0 を返しますね。
shsh_

2021/12/25 15:55

はい。仕様です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問