2 tina leo tina_leo 于 2016.03.27 19:28 提问

编译通过,程序总是自动停止工作
c
 #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;
}

图片说明

7个回答

caozhy
caozhy   Ds   Rxr 2016.03.27 19:58
 #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;
}
tina_leo
tina_leo   2016.03.27 21:01

发现应该在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分开,这样逻辑清楚一些

tina_leo
tina_leo   2016.03.27 21:01

发现应该在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分开,这样逻辑清楚一些

lwhzccjava
lwhzccjava   2016.03.27 21:24

一般就是数组越界,内存非法访问

qq_35691619
qq_35691619   2017.10.20 21:53

非法访问内存就是这样

sinat_27449649
sinat_27449649   2016.03.27 19:40

这种情况一般是数组越界.......

qq423399099
qq423399099   Ds   Rxr 2016.03.27 19:52

稍微调试了发现,for循环之后有这么一个交换exchange(&A[q],&A[j]);
这个地方越界了,q=-1的时候有调用交换,所以崩了
楼主再整理下自己的逻辑。。。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!