首页 新闻 赞助 找找看

自写快速排序对15000量级有序数组排序栈溢出,无序的不溢出,何解?

0
[待解决问题]

快速排序类如下:对已经有序的IList<int> 调用此方法在数据量在15000的时候就会提示栈溢出。

var a = Enumerable.Range(1, 15000).ToArray();
a.QuickSort();//栈溢出
var a = Enumerable.Range(1, 15000).Shuffle().ToArray();
a.QuickSort();//不溢出



 

    internal class QuickSorter<T>
{
private IList<T> A;
private IComparer<T> comparer;
private T tmp;
private T x;
public QuickSorter(IList<T> A, IComparer<T> comparer)
{
this.A = A;
this.comparer = comparer;
}
public QuickSorter(IList<T> A)
: this(A, Comparer<T>.Default)
{
}
public void Sort()
{
Sort(0, A.Count - 1);
}
private void Sort(int p, int r)
{
if (p < r)
{
int q = Partition(p, r);
Sort(p, q - 1);
Sort(q + 1, r);
}
}
private int Partition(int p, int r)
{
x = A[r];
int i = p - 1;
for (int j = p; j < r; j++)
{
if (comparer.Compare(A[j], x) <= 0)
{
i++;
if (comparer.Compare(A[i], A[j]) > 0)
{
Swap(i, j);
}
}
}
i++;
Swap(i, r);
return i;
}
private void Swap(int i, int j)
{
tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
}
Univ的主页 Univ | 菜鸟二级 | 园豆:205
提问于:2011-12-05 17:10
< >
分享
所有回答(4)
0

你将那个有序的数组的顺序调整为从大到小的顺序再试一试!

小小刀 | 园豆:1991 (小虾三级) | 2011-12-05 22:11

你这回答的。。。。。请正面回答问题,从小到大栈溢出,代表这个算法有bug,从大到小能行或不行能解决这个算法的bug吗

支持(0) 反对(0) Univ | 园豆:205 (菜鸟二级) | 2011-12-06 08:28

@hugesoft: 我这么说只是让你知道为什么会栈溢出,因为你这种情况是快速排序最坏情况。如果内存不足的话肯定会报错。

支持(0) 反对(0) 小小刀 | 园豆:1991 (小虾三级) | 2011-12-06 22:11
0

快速排序算法是递归的,但是程序不能用递归写。溢出不溢出取决于递归的深度。不是算法的bug,是你程序的。

Greatest | 园豆:678 (小虾三级) | 2011-12-06 11:41
0

你的Quick sort 在有序的情况下,性能是很低的。这个你在数据结构里面应该学过的。正确的做法是:

 x = A[r]; 这句话改成,在A[p ... r] 之间随机选择一个数字。这就是随机化的技巧。
参考一下代码之美上的quick sort:
void quicksort(int p, int u)
{
int i, m;
if (p >= u) return;
swap(p, randint(p, u));
m = p;
for (i = p+1; i <= u; i++)
if (x[i] < x[p])
swap(++m, i);
swap(p, m);
quicksort(p, m-1);
quicksort(m+1, u);
}


这个代码非常的巧妙。可以细细的体会。

暮夏 | 园豆:391 (菜鸟二级) | 2011-12-07 12:56

3q,纳闷的是效率低也不应该溢出吧,才10000级的,感觉是递归的原因,而归并也是递归并不会出现溢出,算法导论上的随机算法在数量级增加的时候也会溢出。。。

支持(0) 反对(0) Univ | 园豆:205 (菜鸟二级) | 2011-12-07 16:53

@hugesoft: 本来是logn的递归深度,这个深度是什么意思呢?就是40亿的数据,也就是32的深度,估计10000 的深度太大了。我用c语言写,用了10万数据,没有你说的溢出问题,估计和c# 有关系。

支持(0) 反对(0) 暮夏 | 园豆:391 (菜鸟二级) | 2011-12-07 17:15
0

顺序是最坏的情况,可能递归深度是15000. 你自己写个程序看看递归到这么深会不会栈溢出

五星 | 园豆:125 (初学一级) | 2012-09-10 20:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册