新手快速上手掌握基础排序<三>冒泡模拟实现快速排序
2024-01-01 18:30:37
目录
(1)可以采用如qsort中,用void *base来确定数据的开始位置,用num表示数据元素个数,用size表示单个数据的大小,单位为字节,这样便能表示整个数据
(3)可以采用函数指针的形式将要交换的两个数据作为函数指针来互换
听说看到日落金山的人,接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧
引言?
在学习过后冒泡法和快速排序法后,但快速排序的方法似乎我们了解不了底层的排序原理,对于初学的我们来说,何不想着用一个更具体,方便观察的冒泡排序法来进行模拟实现快速排序,来观察底层的排序方法,在此之前我们先了解关于回调函数的相关知识
一:回调函数
1.含义
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当
这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调
用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
2.举例理解?
如:实现一个加减乘除的计算器
#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;
}
3.画图具体分析?
二:冒泡法模拟实现快速排序的功能?
1.冒泡法的局限问题
(1)冒泡法只能排序固定的数据类型
(2)在两项比较时只能比较固定的数据类型?
? ? ? ? ? 如:数组与结构体的比较不相同
(3)在互换时只能呼唤固定的数据类型? ?
? ? ? ? ? 如:数组与结构体互换不相同
2.这三大问题的解决方法?
(1)可以采用如qsort中,用void *base来确定数据的开始位置,用num表示数据元素个数,用size表示单个数据的大小,单位为字节,这样便能表示整个数据
(2)如qsort中将比较写成函数,用函数指针来比较
(3)可以采用函数指针的形式将要交换的两个数据作为函数指针来互换
三:代码实现?
#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;
}
四:谢谢观看
文章来源:https://blog.csdn.net/Miwll/article/details/135325249
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!