这篇文章是 一楼那个学长写的
C库函数qsort七种使用方法示例
七种qsort排序方法<本文中排序都是采用的从小到大排序>
一、对int类型数组排序
C++代码
- int num[100];
Sample:
- int cmp ( const void *a , const void *b )
- {
- return *(int *)a – *(int *)b;
- }
- qsort(num,100,sizeof(num[0]),cmp);
二、对char类型数组排序(同int类型)
C++代码
- char word[100];
Sample:
- int cmp( const void *a , const void *b )
- {
- return *(char *)a – *(char*)b;
- }
- qsort(word,100,sizeof(word[0]),cmp)
三、对double类型数组排序(特别要注意)
C++代码
- double in[100];
- int cmp( const void *a , const void *b )
- {
- return *(double *)a > *(double *)b ? 1 : -1;
- } qsort(in,100,sizeof(in[0]),cmp);
四、对结构体一级排序
C++代码
- struct In {
- double data;
- int other;
- }s[100]
- //按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写
- int cmp( const void *a ,const void *b)
- {
- return (*(In *)a).data > (*(In *)b).data ? 1 : -1;
- }
- qsort(s,100,sizeof(s[0]),cmp);
五、对结构体二级排序
C++代码
- struct In {
- int x; int y;
- }s[100];
- //按照x从小到大排序,当x相等时按照y从大到小排序
- int cmp( const void *a , const void *b )
- {
- struct In *c = (In *)a;
- struct In *d = (In *)b;
- if(c->x != d->x) return c->x – d->x;
- else return d->y – c->y;
- }
- qsort(s,100,sizeof(s[0]),cmp);
六、对字符串进行排序
C++代码
- struct In {
- int data; char str[100];
- }s[100];
- //按照结构体中字符串str的字典顺序排序
- int cmp ( const void *a , const void *b )
- {
- return strcmp( (*(In *)a)->str , (*(In *)b)->str );
- }
- qsort(s,100,sizeof(s[0]),cmp);
七、计算几何中求凸包的cmp
C++代码
- int cmp(const void *a,const void *b)
- //重点cmp函数,把除了1点外的所有点,旋转角度排序
- {
- struct point *c=(point *)a;
- struct point *d=(point *)b;
- if( calc(*c,*d,p[1]) < 0) return 1;
- else if( !calc(*c,*d,p[1])
- && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y))
- //如果在一条直线上,则把远的放在前面
- return 1; else return -1;
- }
PS: 其中的qsort函数包含在的头文件里,strcmp包含在的头文件里
大家自己先做下,不要搜代码
NYOJ 7(街区最短路经)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int x[101],y[101];
int x2[101],y2[101];
int cmp(const void*a,const void*b)
{
return *(int *)a-*(int *)b;
}
int main()
{
int N;
while(scanf("%d",&N)!=EOF)
{
while(N--)
{
int i,n,sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %d",&x[i],&y[i]);
x2[i]=x[i];
y2[i]=y[i];
}
qsort(x2,n,sizeof(x2[0]),cmp);
qsort(y2,n,sizeof(y2[0]),cmp);
for(i=0;i<n;i++)
{
if((x2[n/2]==x[i])&&(y2[n/2]==y[i]))
{
continue;
}
sum+=abs(x[i]-x2[n/2])+abs(y[i]-y2[n/2]);
}
printf("%d\n",sum);
}
}
return 0;
}
NYOJ 540(奇怪的排序) 来自第五届省赛,简单题
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int mmm;// 数本身
int mm;// 反序后的数
}Node;
Node node[55];
int cmp(const void *a,const void *b)
{
Node *c = (Node *)a;
Node *d = (Node *)b;
return c->mm - d->mm;
}
int main()
{
int N,m,n,i,x,k;
scanf("%d",&N);
while(N--)
{
x=0;
scanf("%d %d",&m,&n);
for(i=m;i<=n;i++)
{
x++;
k=i;
node[x].mmm=i;
node[x].mm=0;
while(k)
{
node[x].mm=node[x].mm*10+k%10;
k=k/10;
}
}
qsort(node+1,n-m+1,sizeof(node[1]),cmp);
printf("%d",node[1].mmm);
for(i=2;i<=n-m+1;i++) {
printf(" %d",node[i].mmm);
}
printf("\n");
}
return 0;
}
import java.util.Arrays;
import java.util.Scanner;
public class NYOJ540 {
public static void main(String[] args) {
int from, to, T;
Node node[];
Scanner sc = new Scanner(System.in);
T = sc.nextInt();
int temp;
while(T-->0) {
from = sc.nextInt();
to = sc.nextInt();
node = new Node[to-from+1];
int j = 0;
for(int i=0; i<node.length; i++) {
//q已经初始化为0了
node[i] = new Node();
}
for(int i=from; i<=to; i++) {
node[j].p = i;
temp = i;
while(temp>0) {
/*
* 必须在大while循环构造node数组
* 否则就第一组数据正确
* 因为下面这一句用到了以前的q值
*/
node[j].q = node[j].q*10 + temp%10;
temp /= 10;
}
j++;
}
/*
* 只看API函数,第三个参数是toIndex,以为是下标
* 谁知道具体一看不包括,wa了n次
*/
Arrays.sort(node,0,to-from+1);
System.out.print(node[0].p);
for(int i=1; i<to-from; i++) {
System.out.print(" "+node[i].p);
}
System.out.println(" "+node[to-from].p);
}
}
}
class Node implements Comparable<Node>{
int p;
int q;
public Node() {
this.p = 0;
this.q = 0;
}
@Override
public int compareTo(Node o) {
// TODO Auto-generated method stub
Node other = o;
return this.q - other.q;
}
}