考研计算机复试(qsort排序)

qsort函数
定义:快速排序任意类型数据库函数。
头文件:<stdlib.h>
qsort函数原型:

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

各参数含义:

(1)base是待排序数组首元素地址;

(2)num是数组大小

(3)width是各元素占用空间大小;

(4)函数指针(回调函数)

回调函数:

定义:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

整形

#include<stdio.h>
#include<stdlib.h>
#define maxSize 5
int cmp(const void *a,const void *b)
{
	int L=*((int*)a);
	int R=*((int*)b);
	if(L>R)
	return 1;
	else if(L==R)
	return 0;
	else
	return -1;  
	//return *((int*)a) - *((int*)b); 
}
int main()
{
	int arr[maxSize]={5,6,9,4,1};
	qsort(arr,maxSize,sizeof(arr[0]),cmp);
	for(int i=0;i<maxSize;++i)
	printf("%d ",arr[i]);
	return 0;
}

double型

#include<stdio.h>
#include<stdlib.h>
#define maxSize 5
int cmp(const void *a,const void *b)
{
	double L=*((double*)a);
	double R=*((double*)b);
	if(L>R)
	return 1;
	else if(L==R)
	return 0;
	else
	return -1;  
//	return *(double *)a > *(double *)b ? 1 : -1;
}
int main()
{
	double arr[maxSize]={5.1,2.1,3.1,4.1,1.1};
	qsort(arr,maxSize,sizeof(arr[0]),cmp);
	for(int i=0;i<maxSize;++i)
	printf("%.2f ",arr[i]);
	return 0;
}

字符型

#include<stdio.h>
#include<stdlib.h>
#define maxSize 5
int cmp(const void *a,const void *b)
{
	char L=*((char*)a);
	char R=*((char*)b);
	if(L>R)
	return 1;
	else if(L==R)
	return 0;
	else
	return -1;  
//	return *((char*)a) - *((char*)b);
}
int main()
{
	char arr[]="bcdaf";
	qsort(arr,maxSize,sizeof(arr[0]),cmp);
	for(int i=0;i<maxSize;++i)
	printf("%c ",arr[i]);
	return 0;
}

字符串

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void *a,const void *b)
{
	char *L=*((char**)a);
	char *R=*((char**)b);
	return strcmp(L, R);
}
int main()
{
	char *words[10]=
	{
		"zz","gh","ef","cd","ab"
	};
	int n=5;
	qsort(words,n,sizeof(char*),cmp);
	for(int i=0;i<n;++i)
	puts(words[i]);
	return 0;
}

结构体数组

#include<stdio.h>
#include<stdlib.h>
typedef struct structTest
{
	int a;
	int b;
}structTest;
int cmp(const void *a,const void *b)
{
	int L=((structTest*)a)->a;
	int R=((structTest*)b)->a;
	return L-R;
}
int main()
{
	structTest structArray[5]=
	{
		{1,2},
		{0,3},
		{2,1},
		{5,1},
		{-1,0}
	};
	int n=5;
	qsort(structArray,n,sizeof(structArray[0]),cmp);
	for(int i=0;i<5;++i)
	printf("%d,%d\n",structArray[i].a,structArray[i].b);
	return 0;
}

结构数组的二级排序

#include<stdio.h>
#include<stdlib.h>
typedef struct structTest
{
	int a;
	int b;
}structTest;
int cmp(const void *a,const void *b)
{
	int L=((structTest*)a)->a;
	int R=((structTest*)b)->a;
	if(L>R)
	return 1;
	else if(L==R)
	{
		int l=((structTest*)a)->b;
		int r=((structTest*)b)->b;
		return l-r;
	}
	else
	return -1;
}
int main()
{
	structTest structArray[5]=
	{
		{2,2},
		{2,3},
		{2,1},
		{5,1},
		{-1,0}
	};
	int n=5;
	qsort(structArray,n,sizeof(structArray[0]),cmp);
	for(int i=0;i<5;++i)
	printf("%d,%d\n",structArray[i].a,structArray[i].b);
	return 0;
}

如有错误,欢迎互相交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值