c中的快排
此题出题者本意应该是让我们用堆排序去做,但是鄙人只知何为堆,不知如何做,故投机取巧,用了c语言中的快排qsort();
这个快排在stdlib头文件下
格式为
qsort(数组的起始地址即数组名,元素的个数,每个元素的大小(字节数),自定义函数(指向函数的方向指针,用于排序和决定怎么排))
*> compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是const void *型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void 型转换成实际类型,见下文。
int compar(const void *p1, const void *p2);
如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的前面
如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定
如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的后面
因此,如果想让qsort()进行从小到大(升序)排序,那么一个通用的compar函数可以写成这样:
此处借鉴了一位大哥的博客,特此发出链接,以表敬意:详细的qsort讲解
再就是此题亦限时,需加一句 ios::sync_with_stdio(false); 以防超时。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
int a[1000010];
int cmp(const void *a,const void *b){
return *(int *)b - *(int *)a;
}
int main()
{
ios::sync_with_stdio(false);
int n,m,x;
while(cin>>n>>m){
int j = 0;
for(int i=0; i<n; i++){
cin>>x;
if(j<m)
a[j++] = x;
else{
int d = 0;
for(int l=1; l<m; l++){
if(a[d]>a[l])
d = l;
}
if(a[d]<x)
a[d] = x;
}
}
qsort(a,m,sizeof(a[0]),cmp);
for(int i=0; i<m; i++){
if(i==m-1)
cout<<a[i]<<endl;
else
cout<<a[i]<<" ";
}
}
return 0;
}