堆栈溢出问题,帮忙看看
/************************************
时间:2013.11.21
功能:快速排序
作者:
************************************/
#include <iostream>
#include <time.h>
using namespace std;
template<typename T>
void Swap(T& a,T& b)
{
T temp = a;
a = b;
b = temp;
}
//函数功能:分类
//参数:一个一维数组
//返回:int
template<typename T>
int Sort(T* a,int left,int right)
{
int r = left;
//srand( (unsigned)time( NULL ) );
int k = rand()%(right + 1 - left) + left;
int flag = a[k];//对数组分类的标志
Swap(a[r],a[k]);//把选中的标志和数组第一位交换
left ++;//分类是第一个不参与,因为此时第一位为分组的标志
while(true)
{
while(a[left] < flag)//找出左边大于标志的数
{
left ++;
}
while(a[right] > flag)//找出右边小于标志的数
{
right --;
}
if(left >= right)//分类完成
break;
if(a[left] == a[right])//避免两者相等时进入死循环
{
left ++;
right --;
}
Swap(a[left],a[right]);
}
a[r] = a[right];//把标志位放入到正确位子
a[right] = flag;
return right;
}
template<typename T>
void QuickSort(T* a,int left,int right)
{
if(left < right)
{
int k = Sort(a,left,right);//z找出分类标志的位子
QuickSort(a,left,k);//对左表排序
QuickSort(a,k+1,right);//对右表排序
}
}
int main(void)
{
//srand( (unsigned)time( NULL ) );
int a[10];// = {37,8,30,52,48,34,93,35,22,53};
for(int i = 0; i < 10;i ++)
a[i] = rand()%100;
QuickSort(a,0,9);
for( i = 0; i < 10;i ++)
cout<<a[i]<<"\t";
return 0;
}
当不用srand( (unsigned)time( NULL ) );时可以正常运行
当用srand( (unsigned)time( NULL ) );是,堆栈溢出
[解决办法]
time( NULL ) 返回时间只是到秒数,而一次排序一般不会超过1秒.
你在递归函数中用srand( (unsigned)time( NULL ) );重设随机种子,这就使得产生的随机数几乎总是一样的.
所以,递归函数中不要重设随机种子.只在排序前调用一次即可.