合并为字符排序

时间:2017-03-11 02:10:41

标签: arrays performance sorting mergesort

我有很多指针,比如15,000个。

我有一点代码

for (int x = 0; x < n;x++)
{
    mergeSort(array[x],0,strlen(array[x]-1);
}

我将循环合并排序的原因是按字母顺序对每个索引中的字符进行排序,而不是对数组中的字符串进行排序。

如果我在for循环中进行合并排序,这会失去效率吗?它会让我失去n log n的运行时间吗?

3 个答案:

答案 0 :(得分:0)

如果我们将k作为总字母数,则时间为n*k/n*log(k/n) = k*log(k/n)。它会比你在一个数组中拥有所有字符并将它们全部排序(那将是k*log(k))更快。没有办法渐渐地做得更好。

从实际角度来看,您可以考虑

答案 1 :(得分:0)

合并排序始终为O(n * log_2(n)),其中n是要排序的数组的长度。在这种情况下,这是字符串长度。每种排序都是O(n * log_2(n))

但是,您要为每个字符串重复一次排序,因此总时间是每个字符串的时间总和:

O(n1 * log_2(n1)) + O(n2 * log_2(n2)) + ... + O(nk * log_2(nk))

其中n1,n2,...,nk是所有被排序的k字符串的长度。

如果我们假设所有k个字符串的长度为n,则此算法整体为k * O(n * log_2(n))

答案 2 :(得分:0)

在这种情况下,你可以通过使用某种类型的基数排序来做得更好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()的调用, Intent intent = new Intent(android.content.Intent.ACTION_SEND); File file = new File(songData_new.song_path); intent.setDataAndType(Uri.fromFile(file), "audio/*"); startActivity(intent); 必须扫描整个字符串才能获得长度。因此,您只需通过字符串即可进行排序。

如果您的字符串只包含常规字符和数字,则可以使用较短的数组。

如果字符串非常短,则上述和其他排序算法将有一些开销。相反,你可以使用bubblesort进行测试(是) - 我在某处读到,对于少量项目,bubblesort可以更快(我认为数字大约为6)。

当然,如果字符串是unicode,那么你将不得不做更多的工作(但它看起来并不像查看示例代码)。