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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
vs2012总是停止工作
把vs2012->属性->兼容性->兼容模式 改为windows7
Latex报错SumatraPDF已停止工作
LatexF9编译之后正常显示编译后的PDF,但是关闭PDF界面后会 报错SumatraPDF已停止工作。 这个问题只需要更新一下SumatraPDF就行,具体操作如下: 1.在SumatraPDF选择帮助-检查更新,下载最新版本的SumatraPDF 2.安装SumatraPDF 3,更改SumatraPDF的路径 在Latex中选择 options--execution Modes-
C语言里程序编译无误但运行会弹出程序已停止运行是为什么?
C语言里程序编译无误但运行会弹出程序已停止运行是为什么?原文链接(https://zhidao.baidu.com/question/1178139670043658699.html) 摘要 1. 内存溢出 内存溢出(out of memory)通俗理解就是内存不够,程序所需要的内存远远超出了主机内安装的内存所承受大小,就叫内存溢出。系统会提示内存溢出,有时候会自动关闭软
如何解决EDIUS总是意外停止工作问题
有些小伙伴在一开始使用EDIUS的时候,总是会出现一些小问题,比如添加素材时总是意外停止工作
当程序出现已停止工作
问题描述:  写的程序运行起来后 ,也捕获了异常 但是出现系统级的报错:"程序已停止工作". 原因分析:是子线程里面的程序异常了,但又没有捕获异常所以就会报出这个异常. 解决办法:在子线程中捕获异常,做异常处理.
visual studio2010已停止工作。。。
visual studio 2010 启动时弹出“已停止工作”
vs2012 已停止工作 - 解决办法
最近在学《Windows多媒体程序设计》这门课, 蛋疼, 学的居然是MFC...然后安装了vs2012.   之后又下了几个插件.. 就出问题了。一打开,就提示 vs2012 已停止工作。无比蛋疼阿..  第一次, 利用vs修复工具, 无效。第二次, 卸载了vs。 重新安装, 来来回回折腾了1个多小时, 发现, 重装后还是这个问题...坑。后来百度了一会, 发现了解决办法, 再自己倒腾下。 可以了
我用dev-c++编译的C程序,为什么程序一运行就自动关闭
有3种简单方法:自己加上程序语句1.加头文件#include 然后在最后加system("pause");2.加头文件#include 最后加一句getch();3.在最后加getchar();
MYSQL-workbench已经停止工作的原因
MYSQL-workbench已经停止工作的原因
关闭”xx程序已停止工作”提示窗口
近日在工作中,接手一个项目,程序运行起来后偶发性间隔几个小时或几天就会出现如下(图1, 图2)的”xx程序已停止工作”的提示窗口,这时需要用户手动点击”关闭程序”按钮,进程才会退出。 图1   图2   当然最好的解决办法就是找出程序中导致”程序错误”的原因,但由于对接手的项目不是很熟悉,再加上时间紧迫,难以在短时间找到问题原因,于是给此程序添加一个”守护程序”(即: 检测到