#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;的区别