tina_leo
tina_leo
采纳率50%
2016-03-27 11:28 阅读 1.5k

编译通过,程序总是自动停止工作

 #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 从今以后生命中的每一秒都属于我爱的人 2016-03-27 11: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;
    }
    
    点赞 1 评论 复制链接分享
  • sinat_27449649 kikical 2016-03-27 11:40

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

    点赞 评论 复制链接分享
  • qq423399099 小灸舞 2016-03-27 11:52

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

    点赞 评论 复制链接分享
  • tina_leo tina_leo 2016-03-27 13: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 13: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 生活中的花漾元素 2016-03-27 13:24

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

    点赞 评论 复制链接分享
  • qq_35691619 风大了猪依旧飞不起来 2017-10-20 13:53

    非法访问内存就是这样

    点赞 评论 复制链接分享

相关推荐