c语言题目帮看看啊
voidQuickSort(int*p,intleft,intright){inttemp;inti=left;intj=right;intmiddle=p[(left+...
void QuickSort(int * p, int left, int right)
{
int temp;
int i = left;
int j = right;
int middle = p[(left + right) / 2];
do
{
while ((p[i] < middle) && (i < right))
i++;
while ((p[j] > middle) && (j > left))
j--;
if (i <=j) //此处为何不能写成if(i<j)啊?写了不能得到正确结果
{
temp = p[i];
p[i] = p[j];
p[j] = temp;
i++;
j--;
}
}while (i <= j);
if(left <j)
//此处为什么不能写成if(left!=j)?我觉得j不可能比left小了,最多相等啊...
QuickSort(p, left, j);
if(right > i)//此处也是同上的疑问,i不可能大于right了,最多相等啊?
QuickSort(p, i, right);
}
不解啊?详细解释一下哈
int main()
{
int a[10],i;
for(i=0;i<10;i++)cin>>a[i];
QuickSort(a, 0, 9);
for(i=0;i<10;i++)cout<<a[i]<<" ";
return 0;
} 展开
{
int temp;
int i = left;
int j = right;
int middle = p[(left + right) / 2];
do
{
while ((p[i] < middle) && (i < right))
i++;
while ((p[j] > middle) && (j > left))
j--;
if (i <=j) //此处为何不能写成if(i<j)啊?写了不能得到正确结果
{
temp = p[i];
p[i] = p[j];
p[j] = temp;
i++;
j--;
}
}while (i <= j);
if(left <j)
//此处为什么不能写成if(left!=j)?我觉得j不可能比left小了,最多相等啊...
QuickSort(p, left, j);
if(right > i)//此处也是同上的疑问,i不可能大于right了,最多相等啊?
QuickSort(p, i, right);
}
不解啊?详细解释一下哈
int main()
{
int a[10],i;
for(i=0;i<10;i++)cin>>a[i];
QuickSort(a, 0, 9);
for(i=0;i<10;i++)cout<<a[i]<<" ";
return 0;
} 展开
展开全部
道理二楼的说的非常清楚了!我就举个例子,应该会让你更明白些。
第一个问题:
假如数列是:
-1,-2,-3,5,8,10,9。这7个数字。
运行后,i=j=5,
“if (i <=j) //此处为何不能写成if(i<j)啊?写了不能得到正确结果”
这里,如果改成 if(i<j),那此时就没有进入数字交换,也就没有i++和j--,这样之后,i=j=5,会一直满足while (i <= j); 这个条件,那就是死循环了。
如果硬要改成if(i<j),那必须在这之前增加语句:
if(i==j) i++;j--;
第二个问题:
假如数列是:
1,-2,-3,2,3,4 , 这6个数字。
运行后,1和-3交换,结果:-3,-2,1,2,3,4.
此时,i=0+1=1,j=2-1=1,middle=1
这时程序继续运行,最后 j=1 < i=2 ,跳出循环.
然后 -3,-2 进行sort(p,0,1),因为middle=a[0],如果数字是按顺序的,那最后肯定会有i=j=0,这又满足了刚才第一个问题所说的条件,最后经过j--,即j=-1。
如果写成if(left!=j),则,j=-1 不等于 left=0 ,再次进入sort函数。就会出错,找不到数据a[-1].
只有刚好最后两个数字有进行过数字交换,则会成功。
第一个问题:
假如数列是:
-1,-2,-3,5,8,10,9。这7个数字。
运行后,i=j=5,
“if (i <=j) //此处为何不能写成if(i<j)啊?写了不能得到正确结果”
这里,如果改成 if(i<j),那此时就没有进入数字交换,也就没有i++和j--,这样之后,i=j=5,会一直满足while (i <= j); 这个条件,那就是死循环了。
如果硬要改成if(i<j),那必须在这之前增加语句:
if(i==j) i++;j--;
第二个问题:
假如数列是:
1,-2,-3,2,3,4 , 这6个数字。
运行后,1和-3交换,结果:-3,-2,1,2,3,4.
此时,i=0+1=1,j=2-1=1,middle=1
这时程序继续运行,最后 j=1 < i=2 ,跳出循环.
然后 -3,-2 进行sort(p,0,1),因为middle=a[0],如果数字是按顺序的,那最后肯定会有i=j=0,这又满足了刚才第一个问题所说的条件,最后经过j--,即j=-1。
如果写成if(left!=j),则,j=-1 不等于 left=0 ,再次进入sort函数。就会出错,找不到数据a[-1].
只有刚好最后两个数字有进行过数字交换,则会成功。
展开全部
楼主没有明白快速排序算法的思路吧
void QuickSort(int * p, int left, int right)
{
int temp;
int i = left;
int j = right;
int middle = p[(left + right) / 2];
do
{
while ((p[i] < middle) && (i < right))
i++;
while ((p[j] > middle) && (j > left))
j--;
if (i <=j) //这里是为了假如当i=j的时候i++,j--跳出循环
{
temp = p[i];
p[i] = p[j];
p[j] = temp;
i++;
j--;
}
}while (i <= j);
if(left <j)
//这里是折半法,当折半到剩最后2个元素的时候,j跳出循环就会小于0
QuickSort(p, left, j);
if(right > i)//此处同上,i会大于9
QuickSort(p, i, right);
}
int main()
{
int a[10],i;
for(i=0;i<10;i++)cin>>a[i];
QuickSort(a, 0, 9);
for(i=0;i<10;i++)cout<<a[i]<<" ";
return 0;
}
void QuickSort(int * p, int left, int right)
{
int temp;
int i = left;
int j = right;
int middle = p[(left + right) / 2];
do
{
while ((p[i] < middle) && (i < right))
i++;
while ((p[j] > middle) && (j > left))
j--;
if (i <=j) //这里是为了假如当i=j的时候i++,j--跳出循环
{
temp = p[i];
p[i] = p[j];
p[j] = temp;
i++;
j--;
}
}while (i <= j);
if(left <j)
//这里是折半法,当折半到剩最后2个元素的时候,j跳出循环就会小于0
QuickSort(p, left, j);
if(right > i)//此处同上,i会大于9
QuickSort(p, i, right);
}
int main()
{
int a[10],i;
for(i=0;i<10;i++)cin>>a[i];
QuickSort(a, 0, 9);
for(i=0;i<10;i++)cout<<a[i]<<" ";
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询