快排 找出第k小个数 其中遇到的一些问题

#include<stdio.h>
#include<memory.h>

int d[900000];
void qsort(int d[],int l,int r){
	int key = d[l];
	int i=l,j=r;
	if(l>=r){return;				//return;  直接结束qsort函数
	}
	while(i<j){
		while(i<j&&d[j]>key){ 		//i<j在这个while里必须写,如果不写的话,i>=j的时候外层循环的本次循环也没有结束
			j--;					//升序快排
		}							//一直找到d[j] <key 的时候上边的while循环结束
		d[i]=d[j];					//结束上边的while之后把后边的小于key的值给前边的数据
		while(i<j&&d[i]<key){
			i++;
		}
		d[j]=d[i];
	}
	d[i]=key;
	qsort(d,i+1,r);					//左边和右边再递归快排
	qsort(d,l,i-1);
}
 int main(){
 	int a,b,c,i;
 	while(~scanf("%d",&a)){
 	while(a--){
 		memset(d,0,sizeof(d));//每次初始化d中的数据
		scanf("%d %d",&b,&c);
		for(i=0;i<b;i++){
			scanf("%d",&d[i]);
		}
		qsort(d,0,b-1); 	
		printf("%d\n",d[c-1]);
	 }
	 }
}

c语言中return;用于返回值为void型函数中,表示什么也不返回,用于强制结束函数,把程序的控制权交给函数的调用者。

最近刷题,发现一些数组开的很大放在main函数中不运行,而放在全局里就可以了,下面是关于数组开大溢出问题的解释:

栈区:由操作系统自动分配释放,存放函数的参数值,局部变量的值;当不需要时系统会自动清除。

堆区:由new分配的内存块,不由编译器管,由应用程序控制(相当于程序员控制)。
如果程序员没有释放掉,程序结束后,操作系统会自动回收。

数据区:也称全局区或者静态区,存放全局的东西类似全局变量。

代码区:存放执行代码的地方,类似if else,while,for这种语句。

原来在main函数里面的数组是开在栈区(stack),在函数外面的是开在数据区的。
栈区的内存比较小,所以当数组非常大的时候,就会报错。
假如把数组放在数据区就不会出现这个问题,因为数据区的内存很大。

感谢某博主的博客->图和指导关于数组开大溢出问题

在这里插入图片描述
感谢某博主的博客->关于C语言return 的一些用法
感谢某博主的博客->关于return;和return 0;的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值