目录
(1)可以采用如qsort中,用void *base来确定数据的开始位置,用num表示数据元素个数,用size表示单个数据的大小,单位为字节,这样便能表示整个数据
(3)可以采用函数指针的形式将要交换的两个数据作为函数指针来互换
听说看到日落金山的人,接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧
在学习过后冒泡法和快速排序法后,但快速排序的方法似乎我们了解不了底层的排序原理,对于初学的我们来说,何不想着用一个更具体,方便观察的冒泡排序法来进行模拟实现快速排序,来观察底层的排序方法,在此之前我们先了解关于回调函数的相关知识
如:实现一个加减乘除的计算器
#include <stdio.h>
int jia(int a, int b)
{
return a + b;
}
int jian(int a, int b)
{
return a - b;
}
int cheng(int a, int b)
{
return a * b;
}
int chu(int a, int b)
{
return a / b;
}
void menu()
{
printf("****1.jia ******\n");
printf("****2.jian ******\n");
printf("****3.cheng ******\n");
printf("****4.chu *****\n");
printf("****0.exit *****\n");
}
void Cal(int (*p)(int, int))
{
int a = 0, b = 0;
printf("请输入两个操作数:\n");
scanf("%d%*c%d", &a, &b);
int ret = (*p)(a, b);
printf("%d\n", ret);
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择数字:\n");
scanf("%d",&input);
switch (input)
{
case 1:
Cal(jia);
break;
case 2:
Cal(jian);
break;
case 3:
Cal(cheng);
break;
case 4:
Cal(chu);
break;
case 0:
printf("退出计算器:\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
struct Student
{
int num;
char name[20];
};
//int Comp(const void* p1, const void* p2)
//{
// return (*(int*)p1 - *(int*)p2);
//}
int Comp_name(const void* p1, const void* p2)
{
return strcmp(((struct Student*)p1)->name, ((struct Student*)p2)->name);
}
void Swap(char* buf1, char* buf2, int size)//交换a[j],a[j+1]这两个元素
{
int i = 0;
for (i = 0; i < size; i++)
{
char t = *buf1;
*buf1 = *buf2;
*buf2 = t;
buf1++;
buf2++;
}
}
void Bubble_sort(void* base, int num, int size, int (*cmp)(const void*, const void*))
{
int i = 0,j = 0;
for (i = 0; i < num - 1; i++)//趟数
{
for (j = 0; j < num - 1 - i; j++)//一趟冒泡排序比较的对数
{//如果升序返回>0,交换
if(cmp((char*)base + j * size, (char*)base + (j + 1) * size)>0)
//两个元素比较,需要将a[j],a[j+1]的地址传给cmp
Swap((char*)base+j*size,(char *)base+(j+1)*size,size);//交换
}
}
}
void test2()//测试结构体数据
{
struct Student s[3] = { {1001,"wang"},{1003,"li"},{1002,"zeng"} };
Bubble_sort(s, 3, sizeof(s[0]), Comp_name);
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%5d%8s\n", s[i].num, s[i].name);
}
}
//void test1()//测试整形数据
//{
// int a[] = { 1,4,3,5,2 };
// int sz = sizeof(a) / sizeof(a[0]);
// Bubble_sort(a, sz, sizeof(a[0]), Comp);
//
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", a[i]);
// }
//}
int main()
{
//test1();
test2();
return 0;
}