myQsort()排序函数

题目说明:

实现一个函数myQsort()可以对Int char 字符串或者其他类型进行排序的函数。(提示函数只需要提供排序方法,比较方法通过函数指针,让用户自定义)

示例代码

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

struct A{
	char name[20];
	int num;
};
	
void mysort(void *a, int size, int n, int (*pfun)(void*, void *));
int cmpint(void *a, void *b);
void swap(void *a, void *b, int size);
int cmpchar(void *a, void *b);
int cmpstr1(void *a, void *b);
 int cmpstr2(void *a, void *b);
 int cmpstruct(void *a, void *b);
 
int main(){
	
	int i;
	int a[5] = {4,5,6,7,1};
	char ch[5] = {'a', 'f', 'g', 'b', 'c'};
	char *str[5] = {"aaa", "fff", "ccc", "hhh", "rrr"};
	char src[5][5] = {"aaa", "zzz", "ccc", "hhh", "rrr"};
	struct A s[3] = {{"fff", 99},{"ggg", 65},{"fsf", 87}};
	
	
	mysort(s, sizeof(struct A), 3, cmpstruct);
	for(i = 0; i < 3; i++){
		
		printf("%s %d\n", s[i].name, s[i]. num );
	}

}

//这是排序函数,比较不同的类型要传入不同的参数,最后一个是函数指针,用于传入不同的比较函数
//a是起始地址, size是类型的大小, n是数量, pfun是比较函数
void mysort(void *a, int size, int n, int (*pfun)(void*, void *)){
	
	int i, j;
	//用冒泡排序
	for(i = 0; i < n-1; i++){
		for(j = 0; j < n-1-i; j++){
			if(pfun(a+j*size, a+(j+1)*size) > 0){ //a是void *类型,所以1不能a+1
				swap(a+j*size, a+(j+1)*size, size);
			}
		}
	}
}

//比较int型
int cmpint(void *a, void *b){
	
	if(*(int *)a > *(int *)b){
		return 1;
	}
	return 0;
}

//交换两个内存的内容
 void swap(void *a, void *b, int size){
	 void *p = (void *)malloc(size);
	 memcpy(p, a, size);
	 memcpy(a, b, size);
	 memcpy(b, p, size);
	 free(p);
 }
 
 //比较字符型
 int cmpchar(void *a, void *b){
	 if(*(char *)a > *(char *)b){
		 return 1;
	 }
	 return 0;
 }
 
 //比较字符串
 int cmpstr1(void *a, void *b){
	 
	 return strcmp(*(char **)a, *(char **)b); //把二级指针的指向改变
 }
 
 //比较二维数组
 int cmpstr2(void *a, void *b){
	 
	 char (*p1)[5] = a; //用指针数组做行指针
	 char (*p2)[5] = b;
	 return strcmp(*p1, *p2);
 }
 
 //比较结构体
int cmpstruct(void *a, void *b){
	if(((struct A *)a)->num > ((struct A *)b)->num){
		return 1;
	}
	return 0;
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

正在起飞的蜗牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值