qsort函数的应用(回调函数)

qsort函数的应用

  • 四种不同类型数据的排序,分别是int,char,str,和float
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#pragma warning(disable:4996)
//外部只需要实现一个比较大小的算法,qsort内部实现排序(交换)算法

//比较整形
//传参要传入const *类型
int  ComperInt(const void *p, const void *q)
{

	return (*(int*)p - *(int*)q);

}
//比较字符
int Comperchar(const void *p, const void *q)
{
	return (*(unsigned char*)p - *(unsigned char*)q);
}
//比较字符串
//void* 是可以接收二级指针的
int Comperchar_1(const void *p, const void *q)
{
	return strcmp(*(char **)p, *(char **)q);
}
//比较浮点型
//这种直接减可能造成精度丢失
//int Comperfloat(const void *p, const void *q)
//{
	//return(*(float*)p - *(float*)q);
//}
int CompFloat(const void *e1,const *e2)
{
     float p=float(pow(1,-6));
     if(*(float*)(e1)-*(float*)(e2)>p)
     {
     return 1;
     }
     else if(*(float*)(e1)-*(float*)(e2)<-p)
     {
     return -1;
     }
     else
     {
     return 0;
     }
}
//四种打印函数
void Print(int *arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
void Print_char(const char *brr)
{

	for (int i = 0; i < strlen(brr); i++)
	{
		printf("%c ", brr[i]);
	}
	printf("\n");
}
//这里要注意str是一个指针数组,传进来降维降维成二级指针
void Print_char_1(const char **str,int size1)
{

	for (int i = 0; i < size1; i++)
	{
		printf("%s ", str[i]);
	}
	printf("\n");
}
void Print_f(float *crr, int size_f)
{
	for (int i = 0; i < size_f; i++)
	{
		printf("%.2f ", crr[i]);
	}
	printf("\n");
}
int main(){
	int arr[] = { 155, 55, 88, 6, 7, 8, 9, 12, 23, 48, 7, 8, 24 };
	int size = sizeof(arr) / sizeof(arr[0]);
	char brr[] = "adicfjgheb";
	char *str[] = { "daw", "as", "wwdar" };
	float crr[] = { 200.00, 5.74, 3.90, 5.28 };
	int size_f = sizeof(crr) / sizeof(crr[0]);
	int size_s = sizeof(str) / sizeof(str[0]);
	qsort(arr, size, sizeof(int), ComperInt);
	qsort(brr, strlen(brr), sizeof(char), Comperchar);
	qsort(str, size_s, sizeof(char *), Comperchar_1);
	qsort(crr, size_f, sizeof(float), Comperfloat);
	Print(arr, size);
	Print_char(brr);
	Print_char_1(str,size_s);
	Print_f(crr, size_f);
	system("pause");
	return 0;
}

qsort函数的模拟实现


#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#pragma warning(disable:4996)

//比较大小的函数
int Comstr(const void* p, const void *q)
{
	/*char *s1 = *(char**)p;
	char *s2 = *(char**)q;*/
	return strcmp((char *)p, (char *)q);
}
int  ComperInt(const void *p, const void *q)
{

	return (*(int*)p - *(int*)q);

}
void Swap(char *src, char *dest, int size)
{
	while (size)
	{
		char temp = *src;
		*src = *dest;
		*dest = temp;
		size--;
		src++,dest++;
	}
}
void print(char **arr, int num)
{
	for (int i = 0; i < num; i++)
	{
		printf("%s\n", arr[i]);
	}
}


//qsort内部实现元素的排序(冒泡交换)
void Qsort(void* arr, int num, int size, int(*compar)(const void*, const void*))
{
	assert(arr != NULL);
	assert(compar != NULL);
	//写成char*根本原因是里面元素为char,一个字节便于操作
	char* e = (char*)arr;
	for (int i = 0; i < num - 1; i++)	
	{    
		int ret = 0;
		for (int j = 0; j < num -1-i ; j++)
		{   
			
			//假如这里用brr[i]的话他是char类型,访问的是字符,我想要一个字符串
			//而且比较大小函数的参数列表就是元素的地址
			//(int(*compar)(const void*, const void*))
			if (compar(e+ j*size, e + (j + 1)*size)>0)
			{
				ret = 1;
				Swap(e + j*size, e + (j + 1)*size,size);
			}
		}
		if (ret == 0)
		{
			break;
		}
	}
}

int main(){
	char *arr[] = { "b1234", "a1234", "4321", "abcdef" };
	//int arr[]={5,6,8,9,12,1,3,4,5 };
	int num = sizeof(arr) / sizeof(arr[0]);
	Qsort(arr,num,sizeof(char*),Comstr);
	print(arr,num);
	system("pause");
	return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值