回答編集履歴

1

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

2021/12/26 02:17

投稿

shsh_
shsh_

スコア113

test CHANGED
@@ -39,3 +39,83 @@
39
39
  }
40
40
 
41
41
  ```
42
+
43
+ ---
44
+
45
+ **2021/12/26 追記**
46
+
47
+ kazuma-sさん 2021/12/25 23:07 のコメントを受け、上記の関数is_sorted()を元に
48
+
49
+ 配列が昇順/降順かを判定する関数is_monotonic()を書いてみた。
50
+
51
+ この関数は、配列が昇順または全ての値が等しければ1を、降順であれば-1を、そうでなければ0を返す。
52
+
53
+ なお、nmembが1以下のときは1を返す。
54
+
55
+ ```C
56
+
57
+ int is_monotonic(
58
+
59
+ void *base,
60
+
61
+ size_t nmemb,
62
+
63
+ size_t size,
64
+
65
+ int (*compar)(const void *, const void *))
66
+
67
+ {
68
+
69
+ int order = 0;
70
+
71
+
72
+
73
+ if (nmemb < 2){
74
+
75
+ return 1;
76
+
77
+ }
78
+
79
+
80
+
81
+ for (const char *p = (const char *)base; --nmemb; p += size){
82
+
83
+ int comparison_result = compar(p, p + size);
84
+
85
+
86
+
87
+ if ((order < 0 && comparison_result > 0)
88
+
89
+ || (order > 0 && comparison_result < 0)){
90
+
91
+ return 0;
92
+
93
+ }
94
+
95
+
96
+
97
+ if (order == 0){
98
+
99
+ order = comparison_result;
100
+
101
+ }
102
+
103
+ }
104
+
105
+
106
+
107
+ if (order < 0){
108
+
109
+ return -1;
110
+
111
+ }
112
+
113
+
114
+
115
+ return 1;
116
+
117
+ }
118
+
119
+
120
+
121
+ ```