C自带有快排函数qsort
可以实现常类型和结构元素的排序
函数原型为 void qsort(void*, size_t, size_t, int(__cdecl*)(const void*, const void*));
1.排序数组首地址
2.排序数组个数
3.元素大小
4.排序比较函数
实现常类型int排序
int cmp(const void* a,const void* b)
{
return *(int*)a-*(int*)b;
}
int a[]={1,4,2,5,2};
qsort(a,5,sizeof(int),cmp);
结构数组排序
#include <stdio.h>
#include <string.h>
int c;
typedef struct node
{
int n;
char number[7];
char name[9];
int grade;
}Node;
int atoi(char*a)
{
int i,sum=0;
for(i=0;i<strlen(a);i++)
if(a[i]!=0)
break;
for(;i<strlen(a);i++)
sum=sum*10+a[i];
return sum;
}
int cmp(const void*a,const void*b)
{
Node* ta=(Node*)a;
Node*tb=(Node*)b;
if(c==1||!strcmp(ta->name,tb->name)&&c==2||ta->grade==tb->grade&&c==3)
return ta->n-tb->n;
else if(c==2)
return strcmp(ta->name,tb->name);
else
return ta->grade-tb->grade;
}
int main(void)
{
Node a[1001];
int n,i,ca=1;
while(scanf("%d%d",&n,&c)&&n)
{
for(i=0;i<n;i++)
{
scanf("%s%s%d",a[i].number,a[i].name,&a[i].grade);
a[i].n=atoi(a[i].number);
}
qsort(a,n,sizeof(Node),cmp);
printf("Case %d:\n",ca++);
for(i=0;i<n;i++)
{
printf("%s %s %d\n",a[i].number,a[i].name,a[i].grade);
}
}
return 0;
}
自实现快排quicksort
void quicksort(int left,int right,int* a)
{
int l=left,r=right;
int key = a[left];
if(l>=r)
return;
while(l<r)
{
while(l<r&&a[r]>=key)
r--;
a[l]=a[r];
while(l<r&&a[l]<=key)
l++;
a[r]=a[l];
}
a[l]=key;
quicksort(left,r-1,a);
quicksort(r+1,right,a);
}