题解 | 快速排序
输入n个整数,输出其中最小的k个
http://www.nowcoder.com/practice/69ef2267aafd4d52b250a272fd27052c
/*快速排序(使用递归)*/
#include<stdio.h>
void quicksort(int arr[],int l,int r){
if(l>=r)
return ;
int x=arr[(l+r)>>1]; //使用最中间的进行比较,对于本题,大于x的在左侧,小于x的在右侧 //不要忘了加int
int i=l-1; //防止越界
int j=r+1;
while(i<j){ //递归内部的判断条件 当i=j=x时退出循环
do{ //找到需要更换位置的元素
i++; //不要忘了分号
}while(arr[i]<x); //do……while语句结尾要有分号
do{
j--;
}while(arr[j]>x);
//交换
if(i<j){
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
quicksort(arr,l,i-1); //i-1 和 j+1而不是用x 表示
quicksort(arr,j+1,r);
}
int main(){
int n,k;
while(scanf("%d %d\n",&n,&k)!=EOF){
int *a=(int *)malloc(sizeof(int)*n);
for(int i=0;i<n;i++){
scanf("%d ",&a[i]);
}
quicksort(a,0,n-1);
for(int i=0;i<k;i++){
printf("%d ",a[i]);
}
printf("\n");
}
}