この場合、ある種の基数ソートを使ってO(n log n)を上回ることができます。例えば
、(文字列は本当に短い場合を除き)すべての文字を使用すると、次の操作を行うことができます1つのバイトであれば:
create an array of 256 ints
for each string:
memset array to 0 (*)
loop through the bytes until zero is reached
for each byte increment the corresponding value in the array
loop through the array and write n characters with the value of current pos
(*) instead of memset, you could reset the values to zero in this loop
これはまたに完全な文字列をスキャンしていstrlen()
への呼び出しを排除長さを取得します。だからあなたはあなたの文字列を一回通過するような並べ替えをしています。
文字列には通常の文字と数字しか含まれていない場合は、より短い配列を使用できます。
文字列が実際には短い場合、上記と他のソートアルゴリズムにはオーバーヘッドがあります。代わりに、bubblesortでテストを行うことができます(はい) - 私はどこかで項目の数が少ない場合、バーストートを高速化することができます(数は6程度だと思います)。
もちろん、文字列がUnicodeの場合は、もう少し作業をする必要があります(ただし、例のコードを見るとそうは見えません)。
[X Y問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のように聞こえます。文字列の配列内の各文字列の文字を並べ替える場合は、これで問題ありません。たとえば、 "apple"、 "hello"は "aelpp"、 "ehllo"に変わります。しかし、私はあなたの究極の目標ではないと思う。 – janos
@janosと同じと思っています。おそらく、15,000の文字列をソートするのではなく、15,000個のポインターの配列をソートするためにmergesortを使用することが目標です。あなたはmergesort()のコードを投稿していないので、それがマージソートの最適な実装かどうかはわかりません。 – rcgldr