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

回答編集履歴

3

追記

2020/08/11 06:39

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -20,4 +20,29 @@
20
20
  char* tmp = str[j-1];
21
21
  str[j-1] = str[j];
22
22
  str[j] = tmp;
23
- ```
23
+ ```
24
+
25
+ [追記]
26
+ > qsort(str, N, sizeof(char*),(int(*)(const void*,const void*))&strcmp);
27
+ に置き換えてはいかがでしょう。
28
+
29
+ ごめんなさい、これマチガイ。
30
+ 正しくは:
31
+ ```C
32
+ int str_compare(const void* pa, const void* pb) {
33
+ const char* a = *(const char**)pa;
34
+ const char* b = *(const char**)pb;
35
+ return strcmp(a, b);
36
+ }
37
+ ```
38
+ を定義したうえで
39
+ qsort(str, N, sizeof(char*), &str_compare);
40
+ に置き換え、です。
41
+
42
+ おわびついでに、質問に呈示されたsort(バブルソートかな)で
43
+ ランダムシャフルされた 要素数10000 / 文字列長9 の配列をソートしてみました。
44
+
45
+ Windows10(64bit) / ぽんこつ i7-2600K で 1800[ms]
46
+ 問題で定められた制限時間ギリギリです、問題にあった最大要素数200000だととうてい間に合いません。
47
+
48
+ 標準関数 qsort なら要素数 200000 でも80[ms] でソート完了。

2

微修正

2020/08/11 06:39

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -15,6 +15,7 @@
15
15
  ```
16
16
  において、文字列のコピーを三回やってるのが時間を食ってるかもです。
17
17
  コピーを行わずポインタを入れ替えるだけ↓にすれば、かなり速くなる可能性があります。
18
+ ※ qsort には敵わんでしょうけど
18
19
  ```
19
20
  char* tmp = str[j-1];
20
21
  str[j-1] = str[j];

1

追記

2020/08/10 12:48

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -5,4 +5,18 @@
5
5
 
6
6
  sort(N); 改め、もっと速い
7
7
  qsort(str, N, sizeof(char*),(int(*)(const void*,const void*))&strcmp);
8
- に置き換えてはいかがでしょう。
8
+ に置き換えてはいかがでしょう。
9
+
10
+ [追記] sort() 内の文字列の交換:
11
+ ```
12
+ strcpy(tmp, str[j - 1]);
13
+ strcpy(str[j - 1], str[j]);
14
+ strcpy(str[j], tmp);
15
+ ```
16
+ において、文字列のコピーを三回やってるのが時間を食ってるかもです。
17
+ コピーを行わずポインタを入れ替えるだけ↓にすれば、かなり速くなる可能性があります。
18
+ ```
19
+ char* tmp = str[j-1];
20
+ str[j-1] = str[j];
21
+ str[j] = tmp;
22
+ ```