进阶C语言-指针的进阶(三)

这篇具有很好参考价值的文章主要介绍了进阶C语言-指针的进阶(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

进阶C语言-指针的进阶(三),进阶C语言,c语言,排序算法,算法

📝关于qsort函数,我们可以先去cpluplus网站上面了解一下:
进阶C语言-指针的进阶(三),进阶C语言,c语言,排序算法,算法

//1.排序整型数组,两个整型可以直接使用大于号比较。
//2.排序结构体数组,两个结构体数据可能不能直接使用大于号比较。
//不同类型的数据,比较出大小,方法是有差异的。
void qsort (void* base//待排序数组的第一个元素的地址
,           size_t num//待排序数组的元素个数
,           size_t size//待排序数组中一个元素的大小
,           int (*compar)(const void* e1,const void* e2));//函数指针compar指向了一个函数,这个函数是用来比较两个元素的
//e1和e2中存放的是需要比较的两个元素的地址

🎈1.测试bubble_sort,排序整型数组

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//目标:使用冒泡排序的算法,模拟实现一个排序函数,可以排列任意类型的数据
void bubble_sort(int arr[],int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;  
			}
		}
	}
}
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
void test1()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//降序
	//排序为升序
	int sz = sizeof(arr) / sizeof(arr[0]);
	print_arr(arr, sz);
	bubble_sort(arr, sz);
	print_arr(arr, sz);
}
int main()
{
	//整型数据/字符数据/结构体数据...
	//可以使用qsort函数进行排序
	//测试bubble_sort,排序整型数组
	test1();
	return 0;
}

✅运行示例:
进阶C语言-指针的进阶(三),进阶C语言,c语言,排序算法,算法


🔎我们发现上述代码只适用于整型数据,那么我们是否能写出更一般的更普遍的代码呢?

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//目标:使用冒泡排序的算法,模拟实现一个排序函数,可以排列任意类型的数据
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
//int (*cmp)(const void* e1, const void* e2)
//e1是一个指针,存放了一个要比较的元素的地址
//e2也是一个指针,存放了一个要比较的元素的地址
//e1指向的元素>e2指向的元素,返回>0的数字
//e1指向的元素==e2指向的元素,返回0
//e1指向的元素<e2指向的元素,返回<0的数字
void swap(char* buf1, char* buf2, size_t size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
void bubble_sort(void* base, size_t num, size_t size, int(*cmp)(const void* e1, const void* e2))
{
	//冒泡排序的趟数
	int i = 0;
	for (i = 0; i < num - 1; i++)
	{
		//一趟冒泡排序
		int j = 0;
		for (j = 0; j < num - 1 - i; j++)
		{
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
				//交换
				swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}

	}
}
void test1()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//降序
	//排序为升序
	int sz = sizeof(arr) / sizeof(arr[0]);
	print_arr(arr, sz);
	bubble_sort(arr, sz,sizeof(arr[0]),cmp_int);
	print_arr(arr, sz);
}
int main()
{
	//整型数据/字符数据/结构体数据...
	//可以使用qsort函数进行排序
	//测试bubble_sort,排序整型数组
	test1();
	return 0;
}

✅运行示例:
进阶C语言-指针的进阶(三),进阶C语言,c语言,排序算法,算法
📖运行流程如下:
进阶C语言-指针的进阶(三),进阶C语言,c语言,排序算法,算法

🎈2测试bubble_sort,排序结构体数组

🔎按照年龄排序:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//目标:使用冒泡排序的算法,模拟实现一个排序函数,可以排列任意类型的数据
struct Stu
{
	char name[20];
	int age;
};
//int (*cmp)(const void* e1, const void* e2)
//e1是一个指针,存放了一个要比较的元素的地址
//e2也是一个指针,存放了一个要比较的元素的地址
//e1指向的元素>e2指向的元素,返回>0的数字
//e1指向的元素==e2指向的元素,返回0
//e1指向的元素<e2指向的元素,返回<0的数字
void swap(char* buf1, char* buf2, size_t size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
void bubble_sort(void* base, size_t num, size_t size, int(*cmp)(const void* e1, const void* e2))
{
	//冒泡排序的趟数
	int i = 0;
	for (i = 0; i < num - 1; i++)
	{
		//一趟冒泡排序
		int j = 0;
		for (j = 0; j < num - 1 - i; j++)
		{
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
				//交换
				swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}

	}
}
void test2()
{
	struct Stu arr[] = { {"Zhangsan",20},{"lisi",19},{"wangwu",18} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz,sizeof(arr[0]),cmp_stu_by_age); 
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d", arr[i].name, arr[i].age);
		printf("\n");
	}
	printf("\n");
}
int main()
{
	//整型数据/字符数据/结构体数据...
	//可以使用qsort函数进行排序
	//测试bubble_sort,排序整型数组
	test2();
	return 0;
}

✅运行示例:
进阶C语言-指针的进阶(三),进阶C语言,c语言,排序算法,算法
🔎按照姓名排序:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//目标:使用冒泡排序的算法,模拟实现一个排序函数,可以排列任意类型的数据
struct Stu
{
	char name[20];
	int age;
};
//int (*cmp)(const void* e1, const void* e2)
//e1是一个指针,存放了一个要比较的元素的地址
//e2也是一个指针,存放了一个要比较的元素的地址
//e1指向的元素>e2指向的元素,返回>0的数字
//e1指向的元素==e2指向的元素,返回0
//e1指向的元素<e2指向的元素,返回<0的数字
void swap(char* buf1, char* buf2, size_t size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
int cmp_stu_by_name(const void* e1, const void* e2)
{//strcmp为字符串比较函数,需要添加头文件#include <string.h>
	return strcmp(((struct Stu*)e1)->name , ((struct Stu*)e2)->name);
}
void bubble_sort(void* base, size_t num, size_t size, int(*cmp)(const void* e1, const void* e2))
{
	//冒泡排序的趟数
	int i = 0;
	for (i = 0; i < num - 1; i++)
	{
		//一趟冒泡排序
		int j = 0;
		for (j = 0; j < num - 1 - i; j++)
		{
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
				//交换
				swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}

	}
}
void test2()
{//一个结构体大小32个字节
	struct Stu arr[] = { {"zhangsan",20},{"lisi",19},{"wangwu",18} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d", arr[i].name, arr[i].age);
		printf("\n");
	}
	printf("\n");
}
int main()
{
	//整型数据/字符数据/结构体数据...
	//可以使用qsort函数进行排序
	//测试bubble_sort,排序整型数组
	test2();
	return 0;
}

✅运行示例:
进阶C语言-指针的进阶(三),进阶C语言,c语言,排序算法,算法

好啦,关于qsort函数的知识到这里就先结束啦,后期会继续更新学习C语言的相关知识,欢迎大家持续关注、点赞和评论!❤️❤️❤️文章来源地址https://www.toymoban.com/news/detail-744630.html

到了这里,关于进阶C语言-指针的进阶(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】指针进阶:字符指针&&数组指针&&函数指针

    ✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 🌹 感谢您的点赞与关注,同时欢迎各位有空来访我的 🍁平凡舍 回想之前,我们学了 指针 的一些基础👉 指针与结构体 我们知道了指针的概念: 指针就是

    2023年04月08日
    浏览(35)
  • 【C语言进阶】指针数组 —— 数组指针

    🎬 鸽芷咕 : 个人主页  🔥 个人专栏 : 《C语言进阶篇》 《C语言初阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,前面我们已经把指针大部分内容给学完了,今天就给大家带来数组指针or指针数组!    ⛳️ 很多说这俩名字不是差不

    2024年02月14日
    浏览(26)
  • 进阶C语言-指针的进阶(三)

    📝关于 qsort函数 ,我们可以先去cpluplus网站上面了解一下: ✅运行示例: 🔎我们发现上述代码只适用于整型数据,那么我们是否能写出更一般的更普遍的代码呢? ✅运行示例: 📖运行流程如下: 🔎按照年龄排序: ✅运行示例: 🔎按照姓名排序: ✅运行示例: 好啦,

    2024年02月05日
    浏览(32)
  • C语言进阶之指针的进阶

    指针的主题,我们在C语言初阶博客已经接触过了,我们知道了指针的概念: 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 指针的大小是固定的4/8个字节(32位平台/64位平台)。 指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候

    2024年02月16日
    浏览(23)
  • 进阶C语言-指针的进阶(二)

    数组指针 - 指向数组的指针 - 存放的是数组的地址 - 数组名就是数组的地址。 函数指针 - 指向函数的指针 - 存放的是函数的地址 - 函数名就是函数的地址。 🔭阅读下面这两段代码: 🔭 指针数组: 字符指针数组 - 数组 - 存放的是字符指针 整型指针数组 - 数组 - 存放的是整

    2024年02月07日
    浏览(26)
  • 进阶C语言-指针的进阶(一)

    通过前面的学习,我们了解了指针的概念: 指针变量就是一个变量,用来存放地址,地址唯一标识一块内存空间。 指针的大小是固定为 4/8 个字节( 32位平台/64位平台 )。 指针是有类型的,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。 指针的运算

    2024年02月07日
    浏览(26)
  • 进阶C语言-指针的进阶(中)

    数组指针 - 指向数组的指针 - 存放的是数组的地址 - 数组名就是数组的地址。 函数指针 - 指向函数的指针 - 存放的是函数的地址 - 函数名就是函数的地址。 🔭阅读下面这两段代码: 🔭 指针数组: 字符指针数组 - 数组 - 存放的是字符指针 整型指针数组 - 数组 - 存放的是整

    2024年02月09日
    浏览(28)
  • 进阶C语言-指针的进阶(上)

    通过前面的学习,我们了解了指针的概念: 指针变量就是一个变量,用来存放地址,地址唯一标识一块内存空间。 指针的大小是固定为 4/8 个字节( 32位平台/64位平台 )。 指针是有类型的,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。 指针的运算

    2024年02月09日
    浏览(25)
  • 【C语言进阶(五)】指针进阶详解(上)

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 本篇文章将讲解以下几个方面内容: 字符指针 数组指针 指针数组 数组传参和指针传参 函数指针 在这之前先温故一下指针的概念

    2024年02月12日
    浏览(29)
  • 【C语言进阶篇】之指针进阶(一)

    【C语言进阶技巧】指针掌握之道:解密指针的奇妙世界(第一部)) ❤️博客主页: 小镇敲码人 🍏 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌞回来4天了,加油!!!🍎🍎🍎 💗当你的能力匹配不上你的梦想,当你需要实现的目标匹配不上你的圈子的时候,你就会出现错位

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包