开发者社区> 问答> 正文

快速排序,递归时堆栈溢出:服务报错

"#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 1000
void quick_sort(int a[],int left,int right)
{
int i=left,j=right;
int key;
key=a[0];
while(i<j)//循环结束的条件
{
for(;i<j;j--)
if(a[j]<key)
{
a[i++]=a[j];
break;
}
for(;i<j;i++)
if(a[i]>key)
{a[j--]=a[i];
break;}
}
a[i]=key;
quick_sort(a,left,i-1);
quick_sort(a,i+1,right);
}
void main()
{
int i,array[N]={0};
clock_t start,end;
double t;
start=clock();//开始程序运行计时
srand((unsigned)time(NULL));
for(i=0;i<N;i++)
array[i]=rand()%1000;
quick_sort(array,0,999);
for(i=0;i<N;i++)
printf("%5d",array[i]);
printf("\n");
end=clock();
t=(double)(end-start)/CLOCKS_PER_SEC;
printf("快速排序运行时间:%lf秒\n",t);

}

调试结果显示为

1>------ Build started: Project: quick_sort, Configuration: Debug Win32 ------
1>  quick_sort.c
1>d:\数据结构&算法设计c源程序\quick_sort\quick_sort\quick_sort.c(27): warning C4717: “quick_sort”: 如递归所有控件路径,函数将导致运行时堆栈溢出
1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
求大神指点

"

展开
收起
montos 2020-06-03 15:41:31 496 0
1 条回答
写回答
取消 提交回答
  • "

    首先给你个忠告永远不要省略if for while等语句的大括号

    然后 一行只写一句话

    最后 具体的错误等稍后我看过代码再给出

    ######

    递归爆炸了,改成循环吧

    ######数据不大 可以使用递归  ,数据大了 会出现栈溢出,因为在没有分支结束前或者被强行中断,单个线程是不会释放栈现场的。1.修改栈大小 。2.采用非递归方式。----几乎各个语言都要避免下这个问题哦######应该需要修改编译器堆栈的大小,但没有实际尝试,可以先修改N的大小,看是否堆栈还溢出。是否还有其他错误。######递归函数中没有一个return,递归调用还在必经路径上——连编译器都知道它会归死。######回复 @zhangjihan10 : 模拟一个栈 加上goto语句 就比较简单了 不过代码还是会很乱######回复 @zhangjihan10 : 当然可以, 自己模拟一个栈就可以了, 但是这有什么意义呢?######回复 @猫咪喵喵 :没递归结束条件呀,你能用循环写出来吗######回复 @猫咪喵喵 : 你是怎么贴出带有行号和滚动条这种效果的######然后统计时间的时候居然把数据准备 打印输出结果都算进去 真是乱的可以######

    简单看了一下你的代码

    你的代码确实会栈溢出

    这源于你并没有指定结束递归的条件

    ######

    试试看这个

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #define N 1000
    
    void quick_sort(int a[], int start, int end) {
    
    	int i = start, j = end;
    
    	int key = a[i];
    	while(i < j) {
    		for(; i < j; j--) {
    			if(a[j] < key) {
    				a[i++] = a[j];
    				break;
    			}
    		}
    
    		for(; i < j; i++) {
    			if(a[i] > key) {
    				a[j--] = a[i];
    				break;
    			}
    		}
    	}
    	a[i] = key;
    
    	if(start < i - 1){
    		quick_sort(a, start, i - 1);
    	}
    	
    	if(end > i + 1){
    		quick_sort(a, i + 1, end);
    	}
    
    }
    
    int main() {
    	srand((unsigned)time(NULL)); //随机数种子准备
    
    	int array[N] = {0}; //要被排序的数据准备
    	for(int i = 0; i < N; i++){ //随机生成一些数据
    		array[i] = rand() % N;
    	}
    
    	clock_t start = clock(); //记录开始时间
    	quick_sort(array, 0, 999); //调用排序算法对数据进行排序
    	clock_t end = clock(); //记录结束时间
    
    	for(int i = 0; i < N; i++){ //打印输出排序后的数据
    		printf("%5d", array[i]);
    	}
    	printf("\n");
    
    	double t = (double)(end - start) / CLOCKS_PER_SEC; //计算算法所消耗的时间
    	printf("快速排序运行时间:%lf秒\n", t); //输出时间
    
    	return 0;
    }
    



    ######回复 @月光双刀 : 仔细看提问者的代码 溢出并不是因为数据量过大 而是他的代码有问题 所以说 这个可以解决问题######这个也会栈溢出######编辑器上有个插入代码或脚本啦 @zhangjihan10######回复 @zhangjihan10 : 。######求大神手把手教代码高亮使用方法"
    2020-06-03 17:13:17
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载