C语言中快排函数——qsort()

C语言中快排函数——qsort(),第1张

qsort()函数

qsort()函数是C库提供的快排函数接口

#indlude <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size,
                  int (*compar)(const void *, const void *));
/*
 * base:需要排序的数组
 * nmemb:数组元素个数
 * size: 每个元素的大小
 * compar: 指向一个比较函数,根据cmp函数的比较,决定数组是升序排列还是降序排列
int型数据排序
// a > b 交换, 从小到大
int cmp(const void *a, const void *b)
{
	return *(int *)a - *(int *)b;
}

// a < b 交换, 从大到小
int cmp1(const void *a, const void *b)
{
	return *(int *)b - *(int *)a;
}

int main()
{
	int arr[5] = {4,5,3,7,6};
	int n = sizeof(arr)/sizeof(arr[0]);
	int size = sizeof(int);
	qsort(arr, n, size, cmp);
	qsort(arr, n, size, cmp1);
	for (int i = 0;i < n;i++) {
		printf("%d\t", arr[i]);
	}
	printf("\n");
	
	return 0;
}
char类型

和int类型相似

int cmp1(const void *a, const void *b)
{
	// 由大到小
	return *(char *)b - *(char *)a;
}

int main()
{
	char arr[5] = {'a','A','2','e','W'};
	int n = sizeof(arr)/sizeof(arr[0]);
	int size = sizeof(char);
	qsort(arr, n, size, cmp1);
	for (int i = 0;i < n;i++) {
		printf("%c\t", arr[i]);
	}
	printf("\n");
	
	return 0;
}
double类型
int cmp1(const void *a, const void *b)
{
	// 由大到小
	return ((*(double *)b - *(double *)a) > 0?1:-1);
}

int main()
{
	double arr[5] = {4.3,5.4,4.2,4.31,5.134};
	int n = sizeof(arr)/sizeof(arr[0]);
	int size = sizeof(double);
	qsort(arr, n, size, cmp1);
	for (int i = 0;i < n;i++) {
		printf("%f\t", arr[i]);
	}
	printf("\n");
	
	return 0;
}
结构体类型
struct Date {
	int date;
	int count;
};
int cmp1(const void *a, const void *b)
{
	// 由大到小
	//根据date排序
	//return ((struct Date *)b)->date - ((struct Date *)a)->date;
	//根据count排序
	return ((struct Date *)b)->count - ((struct Date *)a)->count;
}

int main()
{
	struct Date arr[5] = {
		{3,1},
		{4,2},
		{9,5},
		{6,7},
		{8,2}
	};
	int n = sizeof(arr)/sizeof(arr[0]);
	int size = sizeof(arr[0]);
	qsort(arr, n, size, cmp1);
	for (int i = 0;i < n;i++) {
		printf("%d\t", arr[i].date);
		printf("%d\t", arr[i].count);
		printf("\n");
	}
	printf("\n");
	
	return 0;
}
字符串
  • 二维数组
int cmp1(const void *a, const void *b)
{
	// 由大到小
	return strcmp((const char*)a, (const char*)b);
}

int main()
{
	char arr[5][10] = {
		"hello",
		"world",
		"china",
		"xian",
		"print"
	};
	int n = sizeof(arr)/sizeof(arr[0]);
	int size = sizeof(arr[0]);
	qsort(arr, n, size, cmp1);
	for (int i = 0;i < n;i++) {
		printf("%s\n", arr[i]);
	}
	printf("\n");
	
	return 0;
}
  • 字符指针数组
int cmp1(const void *a, const void *b)
{
	// 由大到小
	// 如果是指针数组,传进来的是二级指针,去*后是每一个字符指针(字符串的地址),最终交换的是字符指针的位置
	return strcmp(*(char**)a, *(char**)b);
}

int main()
{
	char *arr[5] = {0};
	int n = sizeof(arr)/sizeof(arr[0]);
	for (int i = 0;i < n;i++) {
		arr[i] = (char *)malloc(sizeof(char*));
		scanf("%s", arr[i]);
	}
	int size = sizeof(arr[0]);
	qsort(arr, n, sizeof(char*), cmp1);
	for (int i = 0;i < n;i++) {
		printf("%s\n", arr[i]);
	}
	printf("\n");
	
	return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1295382.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-10
下一篇2022-06-10

发表评论

登录后才能评论

评论列表(0条)

    保存