回答編集履歴

3

追記

2020/08/11 06:39

投稿

episteme
episteme

スコア16614

test CHANGED
@@ -43,3 +43,53 @@
43
43
  str[j] = tmp;
44
44
 
45
45
  ```
46
+
47
+
48
+
49
+ [追記]
50
+
51
+ > qsort(str, N, sizeof(char*),(int(*)(const void*,const void*))&strcmp);
52
+
53
+ に置き換えてはいかがでしょう。
54
+
55
+
56
+
57
+ ごめんなさい、これマチガイ。
58
+
59
+ 正しくは:
60
+
61
+ ```C
62
+
63
+ int str_compare(const void* pa, const void* pb) {
64
+
65
+ const char* a = *(const char**)pa;
66
+
67
+ const char* b = *(const char**)pb;
68
+
69
+ return strcmp(a, b);
70
+
71
+ }
72
+
73
+ ```
74
+
75
+ を定義したうえで
76
+
77
+ qsort(str, N, sizeof(char*), &str_compare);
78
+
79
+ に置き換え、です。
80
+
81
+
82
+
83
+ おわびついでに、質問に呈示されたsort(バブルソートかな)で
84
+
85
+ ランダムシャフルされた 要素数10000 / 文字列長9 の配列をソートしてみました。
86
+
87
+
88
+
89
+ Windows10(64bit) / ぽんこつ i7-2600K で 1800[ms]
90
+
91
+ 問題で定められた制限時間ギリギリです、問題にあった最大要素数200000だととうてい間に合いません。
92
+
93
+
94
+
95
+ 標準関数 qsort なら要素数 200000 でも80[ms] でソート完了。

2

微修正

2020/08/11 06:39

投稿

episteme
episteme

スコア16614

test CHANGED
@@ -32,6 +32,8 @@
32
32
 
33
33
  コピーを行わずポインタを入れ替えるだけ↓にすれば、かなり速くなる可能性があります。
34
34
 
35
+ ※ qsort には敵わんでしょうけど
36
+
35
37
  ```
36
38
 
37
39
  char* tmp = str[j-1];

1

追記

2020/08/10 12:48

投稿

episteme
episteme

スコア16614

test CHANGED
@@ -13,3 +13,31 @@
13
13
  qsort(str, N, sizeof(char*),(int(*)(const void*,const void*))&strcmp);
14
14
 
15
15
  に置き換えてはいかがでしょう。
16
+
17
+
18
+
19
+ [追記] sort() 内の文字列の交換:
20
+
21
+ ```
22
+
23
+ strcpy(tmp, str[j - 1]);
24
+
25
+ strcpy(str[j - 1], str[j]);
26
+
27
+ strcpy(str[j], tmp);
28
+
29
+ ```
30
+
31
+ において、文字列のコピーを三回やってるのが時間を食ってるかもです。
32
+
33
+ コピーを行わずポインタを入れ替えるだけ↓にすれば、かなり速くなる可能性があります。
34
+
35
+ ```
36
+
37
+ char* tmp = str[j-1];
38
+
39
+ str[j-1] = str[j];
40
+
41
+ str[j] = tmp;
42
+
43
+ ```