2.2.27 #
解答 #
大致上会是一个对数函数,用 Excel 做了简单的拟合。
原始数据:
表中的 n 代表某一个子数组用尽时两个子数组之和,rest 是另一个未用尽的子数组平均剩余长度,times 代表出现次数,表中删去了出现次数小于 100 次的数据。
n | rest | times |
---|---|---|
2 | 0.331378 | 48576 |
3 | 0.333894 | 213568 |
6 | 0.603899 | 48576 |
7 | 0.596223 | 82496 |
14 | 0.773263 | 48576 |
15 | 0.796285 | 16960 |
29 | 0.879808 | 15808 |
30 | 0.883432 | 16960 |
60 | 0.950848 | 15808 |
61 | 0.935764 | 576 |
121 | 0.985163 | 7616 |
122 | 0.96875 | 576 |
243 | 0.93608 | 3520 |
244 | 1.147569 | 576 |
487 | 0.942255 | 1472 |
488 | 1.020833 | 576 |
975 | 1.078125 | 448 |
976 | 1.024306 | 576 |
1952 | 1.129464 | 448 |
代码 #
var arraySize = 1000000;
var sort = new NotifiedMergeSort(arraySize);
for (var i = 0; i < 100; i++)
{
var data = SortCompare.GetRandomArrayInt(arraySize);
sort.Sort(data);
}
Console.WriteLine("n\trest\ttimes");
for (var i = 0; i < sort.NArraySize.Length; i++)
{
if (sort.NArraySize[i] != 0)
Console.WriteLine(i + "\t" + sort.NArraySize[i] / sort.NArraySizeTime[i] + "\t" + sort.NArraySizeTime[i]);
}
// 大致上是一个对数函数