大家有用C#写过排序算法吗?为什么我写的快速排序比插入排序还慢!?

lbiori241 2006-10-30 08:39:01
测试用例是随机生成的10000个在0到1之间的随机数。
算法的执行时间我用StopWatch测的。
调用插入排序用时在300ms左右,而调用快速排序却要用到12000ms!!!!这是怎么回事?
我设置断点查看到排完序的数组,两个算法均没有问题。
快速排序是用递归写的,而插入排序没有递归,难道是C#调用系统堆栈很慢?
c#的内部机制我不太清楚,期待高手出来解答。
我把我的代码贴在下面:
public float[] Sort_Insert(float[] sequence, int low, int high)//插入排序
{
sorted = new float[sequence.Length];
sequence.CopyTo(sorted,0);
Stopwatch watch = new Stopwatch();//实例化跑马表
watch.Start();//开始计时
//-------------------
int i;
float temp;
for (int j = low + 1; j <= high; j++)
{
i = j - 1;
temp = sorted[j];
while (i >= low && sorted[i] > temp)//依次将j以前的元素后移一位
{
sorted[i + 1] = sorted[i];
i--;
}
sorted[i + 1] = temp;
}
//-------------------
watch.Stop();//计时停止
lbTime.Text = watch.ElapsedMilliseconds.ToString() + " ms";//得到运行的时间,毫秒级
return sorted;
}

-------------------------------------------------------------
public float[] Sort_Quick(float[] sequence, int low, int high)//快速排序
{
sorted = new float[sequence.Length];
sequence.CopyTo(sorted, 0);
Stopwatch watch = new Stopwatch();//实例化跑马表
watch.Start();//开始计时
//-------------------
int pivot;//枢轴
if (low < high)
{
pivot = Partition1(sorted, low, high);
Sort_Quick(sorted, low, pivot - 1);
Sort_Quick(sorted, pivot + 1, high);
}
//-------------------
watch.Stop();//计时停止
lbTime.Text = watch.ElapsedMilliseconds.ToString() + " ms";//得到运行的时间,毫秒级
return sorted;
}


private int Partition1(float[] sequence, int low, int high)
{
float temp = sequence[high];
int i = low - 1;
for (int j = low; j <= high - 1; j++)
{
if (sequence[j] <= temp)
{
i++;
Exchange(i, j);//交换两数
}
}
Exchange(i + 1, high);//交换两数
return i + 1;
}
...全文
191 4 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lbiori241 2006-10-31
  • 打赏
  • 举报
回复
靠,昨天编程编头昏了,居然范这种低级错误。没有把快排的递归函数独立出来。晕。多谢shrinerain的提醒,现在问题解决了。
10000个随机样本用快排只用5ms
liujia_0421 2006-10-30
  • 打赏
  • 举报
回复
看下数据结构...
shrinerain 2006-10-30
  • 打赏
  • 举报
回复
你的快排每次都sorted = new float[sequence.Length];
sequence.CopyTo(sorted, 0);
这是一个非常大的开销
lbiori241 2006-10-30
  • 打赏
  • 举报
回复
没有人知道吗?自己顶一下
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2006-10-30 08:39
社区公告

让您成为最强悍的C#开发者