问题描述
- 编译通过,程序总是自动停止工作
-
#include<stdlib.h> #include<stdio.h> //exchange 函数,用来交换两个数 void exchange(int *a,int *b){ int temp; temp=*a; *a=*b; *b=temp; } //快排函数,把数组从A[P]到A[q]进行排序 void Qsort(int A[],int p,int q) { int i,j; for(i=p,j=p;i<=q-1;){ if(A[i]<=A[q]){ exchange(&A[i],&A[j]); i++; j++; } else i++; } exchange(&A[q],&A[j]); int a=q; q=j-1; Qsort(A,p,q); p=j; q=a; Qsort(A,p,q); } //主函数 int main() {//这里先声明了一个数组 int A[10]={2,6,3,22,56,36,54,25,64,33}; Qsort(A,0,9); int i; for(i=0;i<=9;i++){ printf("%d",A[i]); } return 0; }
解决方案
#include<stdlib.h>
#include<stdio.h>
//快排函数,把数组从A[P]到A[q]进行排序
void Qsort(int A[],int p,int q)
{
int i = p;
int j = q;
int temp = A[i];
if( p < q)
{
while(i < j)
{
while((A[j] >= temp) && (i < j))
{
j--;
}
A[i] = A[j];
while((A[i] <= temp) && (i < j))
{
i++;
}
A[j]= A[i];
}
A[i] = temp;
Qsort(A,p,i-1);
Qsort(A,j+1,q);
}
else
{
return;
}
}
//主函数
int main()
{//这里先声明了一个数组
int A[10]={2,6,3,22,56,36,54,25,64,33};
Qsort(A,0,9);
int i;
for(i=0;i<=9;i++){
printf("%d ",A[i]);
}
return 0;
}
解决方案二:
发现应该在exchange(&A[q],&A[j]);后加一个判断条件,确保p小于q之后才能进行递归
改后代码:
int a=q;
if(j-1>p){
q=j-1;
Qsort(A,p,q);}
if(j+1<a){
p=j+1;
q=a;
Qsort(A,p,q);}
不过这样代码不太有可读性,按照标准的算法,应该把partion 和Qsort分开,这样逻辑清楚一些
解决方案三:
发现应该在exchange(&A[q],&A[j]);后加一个判断条件,确保p小于q之后才能进行递归
改后代码:
int a=q;
if(j-1>p){
q=j-1;
Qsort(A,p,q);}
if(j+1<a){
p=j+1;
q=a;
Qsort(A,p,q);}
不过这样代码不太有可读性,按照标准的算法,应该把partion 和Qsort分开,这样逻辑清楚一些
解决方案四:
一般就是数组越界,内存非法访问
解决方案五:
这种情况一般是数组越界.......
解决方案六:
稍微调试了发现,for循环之后有这么一个交换exchange(&A[q],&A[j]);
这个地方越界了,q=-1的时候有调用交换,所以崩了
楼主再整理下自己的逻辑。。。
时间: 2024-08-15 22:01:21