vc中参数传递的问题

来源:百度知道 编辑:UC知道 时间:2024/09/28 15:35:43
用快速排序法写了一个函数,有三个参数,当点击一个按钮时会调用该函数,

void CMy2Dlg::QuicSort(int x[],int s,int t)//快速排序
{
int i=s,j=t;
int tmp;
if(s<t)
{
tmp=x[s];
while (j>i&&x[j]>tmp)
{
j--;
}
x[i]=x[j];
while(i<j&&x[i]<tmp)
i++;
x[j]=x[i];
}

x[i]=tmp;
QuicSort(x,s,i-1);
QuicSort(x,i+1,t);
}

void CMy2Dlg::OnButton4()
{
// TODO: Add your control notification handler code here
QuicSort(b,0,9);

}

b是一个已经定义了的整型数组。
问题是当我调试的时候,看到s,t传入的值分别是0和-1,也就是说,传给了s却没有传给t。换QuicSort(b,2,3),则s=2,t=1
而且会弹出一个窗口说“unhandled exception in ****:0xC00000FD stack overflow”.

这是怎么回事?

快速排序算法是有问题的。传入的值不可能有问题的,不知道你是怎么调试说传入的值有问题。

你的函数形参有 s 和 t ,在函数体内,你又定义 s 和 t,从这点可以看出你基础很差啊,先把基础打好吧。

我跟了一下你的程序,有诸多不明白的地方,你的数组是多大的?是10个吗?你的算法思路不太清晰。你看看下面这个算法,会有所发现的。

设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一躺快速排序的算法是:
1)、设置两个变量I、J,排序开始的时候I:=1,J:=N;
2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];
3)、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;
4)、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;
5)、重复第3、4步,直到I=J;
例如:待排序的数组A的值分别是:(初始关键数据X:=49)
A[1] A[2] A[3] A[4] A[5] A[6] A[7]:
49 38 65 97 76 13 27
进行第一次交换后: 27 38 65 97 76 13 49
( 按照算法的第三步从后面开始找)
进行第二次交换后: 27 38 49 97 76 13 65
( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时I:=3 )
进行第三次交换后: 27 38 13 97 76 49 65
( 按照算法的第五步将又一次执行算法的第三步从后开始找
进行第四次交换后: 27 38 13 49 76 97 65
( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时J:=4 )
此时再执行第三步的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:27 3