C语言自带快速排序函数qsort()

qsort基本格式

功 能: 使用快速排序例程进行排序
头文件:stdlib.h

void qsort(void*base,
			size_t num, 
			size_t width,
			int(__cdecl*compare)(const void*,const void*)
			)

各参数:
1 数组名(待排序数组首地址 )
2 数组中待排序元素数量
3 各元素的占用空间字节数 (sizeof(类型/对象))
4 指向函数的指针,指向cmp函数,决定排序顺序(见下)

补充:cmp函数

int cmp(const void*a,const void*b)		//a,b为指针,可以指向任意类型的值,但指向的值必须为常量
{
	return *(int*)a-*(int*)b;		//先强制类型转换,再取内容
}

若升序,则a>b时返回一个正值;
若降序,则a>b时返回一个负值。

注例

以下各例均为从小到大排序,毫无健壮性可言。

对int排序

#include <stdio.h>
#include <stdlib.h>

int cmp ( const void  *a , const void  *b ) 
{
	return *(int *)a - *(int *)b;
}

int main(int argc, char *argv[]) 
{
	int n,i;
	int buf[100];

	while(scanf("%d",&n)!=EOF) 
	{
		for(i=0;i<n;++i)
			scanf("%d",&buf[i]);
			
		qsort(buf,n,sizeof(buf[0]),cmp);
		
		for(i=0;i<n;++i)
			printf("%d ",buf[i]);
	}
	return 0;
}

对结构体排序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct E 
{
	char name[101];
	int age;
	int score;
} buf[1000];

int cmp(const void* x, const void* y) 
{	
	struct E* a = (struct E*)x;
	struct E* b = (struct E*)y;
	int temp;
	if(a->score!=b->score)	return a->score-b->score; //分数不同,分数低的在前
	temp = strcmp(a->name,b->name);
	if(temp!=0) return temp;//分数相同,名字不同,ASCII小的在前
	else return a->age-b->age;//分数姓名都相同,年龄小的在前	
}

int main(int argc, char *argv[]) 
{	
	int n,i;
	while(scanf("%d",&n)!=EOF)
	{
		for(i=0;i<n;++i)
			scanf("%s%d%d",buf[i].name,&buf[i].age,&buf[i].score);
		
		qsort(buf,n,sizeof(buf[0]),cmp);
		
		for(i=0;i<n;++i)
			printf("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score);	
	}
	return 0;
}
发布了3 篇原创文章 · 获赞 0 · 访问量 431

猜你喜欢

转载自blog.csdn.net/oheyec_/article/details/86379274