题目说明:
实现一个函数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;
}