开发者社区> 问答> 正文

快速排序,递归时堆栈溢出:配置报错 

#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 ========== 求大神指点

展开
收起
kun坤 2020-06-02 14:30:26 587 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-02 14:30:33
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

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