- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我不明白:为什么对于任何大小的 n
,我的插入排序实现每次都优于合并排序?
public List<Int32> InsertionSort(List<Int32> elements, Boolean ascending = true)
{
for (Int32 j = 1; j < elements.Count; j++)
{
Int32 key = elements[j];
Int32 i = j - 1;
while (i >= 0 && (elements[i].CompareTo(key) > 0) == ascending)
elements[i + 1] = elements[i--];
elements[i + 1] = key;
}
return elements;
}
public List<Int32> MergeSort(List<Int32> elements, Boolean ascending = true)
{
Sort(elements, 0, elements.Count - 1);
return elements;
}
private void MergeSort(List<Int32> elements, Int32 startIndex, Int32 count)
{
if(startIndex < count)
{
Int32 half = (startIndex + count).Divide(2, RoundMethod.Floor);
Sort(elements, startIndex, half);
Sort(elements, half + 1, count);
Merge(elements, startIndex, half, count);
}
}
public List<Int32> Merge(List<Int32> elements, Int32 lowerBound, Int32 half, Int32 upperBound)
{
Int32 i = 0;
Int32 j = 0;
Int32 lowerElementsCount = half - lowerBound + 1;
Int32 upperElementsCount = upperBound - half;
List<Int32> left = new List<Int32>();
while (i < lowerElementsCount)
left.Add(elements[lowerBound + i++]);
List<Int32> right = new List<Int32>();
while (j < upperElementsCount)
right.Add(elements[half + j++ + 1]);
left.Add(Int32.MaxValue);
right.Add(Int32.MaxValue);
i = 0;
j = 0;
for (int k = lowerBound; k <= upperBound; k++)
if (left[i] <= right[j])
{
elements[k] = left[i];
i++;
}
else
{
elements[k] = right[j];
j++;
}
return elements;
}
这是我的结果:
SORTING 1 ELEMENTS
MERGE-SORT: TIME SPENT: 0ms (1513 ticks)
INSERTION-SORT: TIME SPENT: 0ms (1247 ticks)
SORTING 10 ELEMENTS
MERGE-SORT: TIME SPENT: 1ms (2710 ticks)
INSERTION-SORT: TIME SPENT: 0ms (3 ticks)
SORTING 100 ELEMENTS
MERGE-SORT: TIME SPENT: 0ms (273 ticks)
INSERTION-SORT: TIME SPENT: 0ms (11 ticks)
SORTING 1000 ELEMENTS
MERGE-SORT: TIME SPENT: 1ms (3142 ticks)
INSERTION-SORT: TIME SPENT: 0ms (72 ticks)
SORTING 10000 ELEMENTS
MERGE-SORT: TIME SPENT: 18ms (30491 ticks)
INSERTION-SORT: TIME SPENT: 0ms (882 ticks)
测试代码:
static void Main(string[] args)
{
for (int i = 1; i < 100000; i*=10)
{
List<Int32> elements = GetFilledList(i, 0, Int32.MaxValue, false);
Console.WriteLine("SORTING {0} ELEMENTS", elements.Count);
Stopwatch sw = new Stopwatch();
//MERGE SORT
sw.Start();
new MergeSort().Sort(elements);
sw.Stop();
Console.WriteLine("MERGE-SORT: TIME SPENT: {0}ms ({1} ticks)", sw.ElapsedMilliseconds, sw.ElapsedTicks);
//INSERTION SORT
sw.Restart();
new InsertionSort().Sort(elements);
sw.Stop();
Console.WriteLine("INSERTION-SORT: TIME SPENT: {0}ms ({1} ticks)", sw.ElapsedMilliseconds, sw.ElapsedTicks);
Console.WriteLine();
}
Console.ReadKey();
}
如果有人想知道我是从 Introduction to Algorithms, Thomas H. Cormen (Author), Charles E. Leiserson (Author), Ronald L. Rivest (Author), Clifford Stein (Author) 得到这些算法的
编辑:
static List<Int32> GetFilledList(Int32 quantity, Int32 lowerBound, Int32 upperBound, Boolean mayRepeat = true)
{
List<Int32> numbers = new List<Int32>();
Random r = new Random();
for (int i = 0; i < quantity; i++)
{
Int32 numero = r.Next(lowerBound, upperBound);
while(!mayRepeat && numbers.Contains(numero))
numero = r.Next(lowerBound, upperBound);
numbers.Add(numero);
}
return numbers;
}
最佳答案
因为,归并排序后,元素中的对象已经排好序了。再做一个
elements = GetFilledList(i, 0, Int32.MaxValue, false);
之前
sw.Restart();
关于c# - 为什么在此实现中插入排序总是击败合并排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8304021/
我决定通过访问一个内部变量来解决 GNU libstdc++ 中的一个错误。回想起 Johannes 在他的博客上解决了这个问题,我检查了一下……但无法理解代码,除了获取静态初始化程序来完成肮脏工作的
多年后回到 C++;试图 catch C++11 和 14。我读过右值和移动语义。我以为我理解这个概念。显然不是。我看过几十个例子。但是我根本无法编译我的代码。我一定在示例中遗漏了一些明显的东西。由于
我正在用 celerybeat 运行 django+celery,但出现了这个错误 .../local/lib/python2.7/site-packages/celery/beat.py", lin
我已经阅读了很多关于 CORS/Lambda/AWS API 网关配置的内容,包括 AWS 的设置帮助: http://docs.aws.amazon.com/apigateway/latest/de
在页面加载的 asp.net Web 应用程序中,我获取当前页面 url 并将其存储在 session 变量中以跟踪用户所在的页面,以便他们在进入管理区域时可以返回到该页面,进行一些导航等。然后他们可
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
在 Swift 中,我正在尝试构建一个大型项目集合。在移动中在 CoreData 中创建元素时,速度非常快。然而,当试图为这些项目保留索引时,创建数组 Swift 会对性能产生很大影响。下面的代码是
我有一个定期任务,我正在使用 worker 在 heroku procfile 上实现: Procile web: gunicorn voltbe2.wsgi --log-file - --log-l
我正在用 C# 编写一个应用程序,该应用程序使用 Office Outlook Interop(2010;版本 14)通过 MAPI 访问电子邮件数据。 到目前为止,我必须在 Outlook 的“程序
显然,sun.net.www.protocol.http.HttpURLConnection 将始终将“Java/version”附加到 UserAgent。因此,JSoup Connection.u
我是一名优秀的程序员,十分优秀!