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

回答編集履歴

1

追記

2018/01/15 09:58

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,2 +1,44 @@
1
1
  少なくとも`while(gap < 0)`だと一度も条件を満たしそうにないですね。
2
- 比較演算子の向きが逆なのではないでしょうか。
2
+ 比較演算子の向きが逆なのではないでしょうか。
3
+
4
+ 追記
5
+ ---
6
+ 組んでみました。元のコードからかけ離れていますし、**Cですけれど。**
7
+ ```C
8
+ // Warning : It's NOT sort function.
9
+ int *insert_n(int *arr, size_t len, size_t gap) {
10
+ for(size_t i = gap; i < len; i += gap) {
11
+ if(arr[i-gap] <= arr[i]) continue;
12
+
13
+ for(size_t j = 0; j < i; j += gap) {
14
+ if(arr[j] <= arr[i]) continue;
15
+
16
+ int tmp = arr[j];
17
+ arr[j] = arr[i];
18
+ arr[i] = tmp;
19
+ }
20
+ }
21
+ return arr;
22
+ }
23
+
24
+ // Sort functions
25
+ int *insert_sort(int *arr, size_t len) {
26
+ return insert_n(arr, len, 1);
27
+ }
28
+ int *shell_sort(int *arr, size_t len) {
29
+ for(size_t gap = len/2; gap > 0; gap /= 2) {
30
+ insert_n(arr, len, gap);
31
+ }
32
+ return arr;
33
+ }
34
+ ```
35
+
36
+ ちなみにこれは**昇順に並び替える**コードです。
37
+ しっかり理解すれば、どこを書き換えて降順にするかはすぐわかるかと思います。
38
+
39
+ 比較関数を渡すようにするともっとそれっぽくなりそうですね。
40
+
41
+ ---
42
+ C++らしく書きたいのでしたら、まず配列を捨て`std::vector`/`std::array`に乗り換えてください。
43
+ スマートポインタと参照を適宜使えば生ポインタも捨てられます。
44
+ さらに、`stdio.h`系関数ではなく`iostream`を使えると良いですね。