teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

kazuma-sさん 2021/12/25 23:07 のコメントを受け、is_monotonic()関数を書いた。

2021/12/26 02:17

投稿

shsh_
shsh_

スコア113

answer CHANGED
@@ -18,4 +18,44 @@
18
18
 
19
19
  return 1;
20
20
  }
21
+ ```
22
+ ---
23
+ **2021/12/26 追記**
24
+ kazuma-sさん 2021/12/25 23:07 のコメントを受け、上記の関数is_sorted()を元に
25
+ 配列が昇順/降順かを判定する関数is_monotonic()を書いてみた。
26
+ この関数は、配列が昇順または全ての値が等しければ1を、降順であれば-1を、そうでなければ0を返す。
27
+ なお、nmembが1以下のときは1を返す。
28
+ ```C
29
+ int is_monotonic(
30
+ void *base,
31
+ size_t nmemb,
32
+ size_t size,
33
+ int (*compar)(const void *, const void *))
34
+ {
35
+ int order = 0;
36
+
37
+ if (nmemb < 2){
38
+ return 1;
39
+ }
40
+
41
+ for (const char *p = (const char *)base; --nmemb; p += size){
42
+ int comparison_result = compar(p, p + size);
43
+
44
+ if ((order < 0 && comparison_result > 0)
45
+ || (order > 0 && comparison_result < 0)){
46
+ return 0;
47
+ }
48
+
49
+ if (order == 0){
50
+ order = comparison_result;
51
+ }
52
+ }
53
+
54
+ if (order < 0){
55
+ return -1;
56
+ }
57
+
58
+ return 1;
59
+ }
60
+
21
61
  ```