妙用指针实现qsort

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

qsort是什么

qsort函数是C语言标准库中的一个快速排序函数,位于stdlib.h头文件中。(可以对任意类型进行排序的函数)
函数为:

void qsort(
    void *base,
    size_t nmemb,
    size_t size,
    int (*compar)(const void *, const void *)
    );

参数解释
参数base - base指向数组的起始地址,通常该位置传入的是一个数组名
参数nmemb - nmemb表示该数组的元素个数
参数size - size表示该数组中每个元素的大小(字节数)
参数(*compar)(const void *, const void *) - 此为指向比较函数的函数指针,决定了排序的顺序。

qsort代码使用例子

#include <stdlib.h>

int cmp_int(const void* p1, const void* p2)
{
	return (*(int*)p1 - *(int*)p2);
}

void print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

//测试qsort排序整型数据
test1()
{
	int arr[10] = { 3,1,5,2,4,7,9,6,8,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//默认是升序的
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print(arr, sz);
}

//测试qsort排序结构体数据
struct Stu
{
	char name[20];
	int age;
};

int cmp_stu_by_age(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}

void test2()
{
	struct Stu arr[] = { {"zhangsan", 20}, {"lisi", 50},{"wangwu", 15} };
	int sz = sizeof(arr) / sizeof(arr[0]); 
	qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);
}

int cmp_stu_by_name(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}

void test3()
{
	struct Stu arr[] = { {"zhangsan", 20}, {"lisi", 50},{"wangwu", 15} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);
}

int main()
{
//以上均为升序排列
	//test1();
	//test2();
	test3();

	return 0;
}

代码解释qsort函数第四个参数(函数指针),自定义compar函数规则是
妙用指针实现qsort,算法,经验分享,c语言,程序人生,笔记

冒泡排序引言

代码演示:

# include <stdio.h>
int main(void)
{
    int a[] = {2,01,811,5};
    int n;  //存放数组a中元素的个数
    int i;  //比较的轮数
    int j;  //每轮比较的次数
    int buf;  //交换数据时用于存放中间数据
    n = sizeof(a) / sizeof(a[0]);  /*a[0]是int型, 占4字节, 所以总的字节数除以4等于元素的个数*/
    for (i=0; i<n-1; ++i)  //比较n-1轮
    {
        for (j=0; j<n-1-i; ++j)  //每轮比较n-1-i次,
        {
            if (a[j] > a[j+1])
            {
                buf = a[j];
                a[j] = a[j+1];
                a[j+1] = buf;
            }
        }
    }
    for (i=0; i<n; ++i)
    {
        printf("%d\x20", a[i]);
    }
    printf("\n");
    return 0;
}

妙用指针实现qsort,算法,经验分享,c语言,程序人生,笔记

解释:上面的冒泡排序只对整形进行排序,
外循环控制趟数,内循环控制比较次数
前后两个比较,不满足规则就交换-
如果是升序排序,每次将最大的放在最后一个,最后一个就不动了
如果是降序排序,每次将最小的放在最后一个,最后一个就不动了

冒泡排序模拟qsort函数

void Swap(char* buf1, char* buf2, int size)//交换arr[j],arr[j+1]这两个元素
{
	int i = 0;
	char tmp = 0;
	for (i = 0; i < size; i++)
	{
		tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}

void bubble_sort(void* base, int num, int size, int (*cmp)(const void*, const void*))
{
	int  i = 0;
	//趟数
	for (i = 0; i < num - 1; i++)
	{
		int j = 0;
		//一趟内部比较的对数
		for (j = 0; j < num - 1 - i; j++)
		{
			//假设需要升序cmp返回>0,交换
			if (cmp((char*)base+j*size, (char*)base+(j+1)*size)>0)//两个元素比较,需要将arr[j],arr[j+1]的地址要传给cmp
			{
				//交换
				Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}
	}

}

struct Stu
{
	char name[20];
	int age;
};


int cmp_stu_by_age(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}

//测试bubble_sort 排序结构体数据
//void test2()
//{
//	struct Stu arr[] = { {"zhangsan", 20}, {"lisi", 50},{"wangwu", 15} };
//	int sz = sizeof(arr) / sizeof(arr[0]); 
//	bubble_sort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);
//}

int cmp_stu_by_name(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}


void test3()
{
	struct Stu arr[] = { {"zhangsan", 20}, {"lisi", 50},{"wangwu", 15} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//printf("%d\n", sizeof(struct Stu));
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);
}


//B
int cmp_int(const void* p1, const void* p2)
{
	return (*(int*)p1 - *(int*)p2);
}

 
//测试bubble_sort 排序整型数据
void test1()
{
	int arr[10] = { 3,1,5,2,4,7,9,6,8,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
}
int main()
{
	//test1();
	//test2();
	test3();

	return 0;
}

**注:void中文翻译为"无类型"。常用在程序编写中对定义函数的参数类型、返回值、函数中指针类型进行声明。
void的字面意思是"无类型",void 则为"无类型指针",void 可以指向任何类型的数据。

代码解释,以test3()为例,运行到test();进入函数内部,初始化结构体,调用自定义模拟qsort函数bubble_sort,外部循环和内部循环与冒泡排序相同,主要看判断,和交换函数,
先看判断函数cmp_stu_by_name,两个参数为const void类型,表示他们两个为任意指针传参,函数内部将两个指针强转成我们需要的指针类型struct Stu,然后比较name大小,这里用到了strcmp函数,他对两个字符数组首元素大小比较的,
p1的name首元素小于p2的首元素返回负值,p1的name首元素大于p2的首元素返回正值,p1的name首元素等于p2的首元素返回0,
然后看交换函数Swap,这里用char类型作为形参,是因为,我们不知道传过来的是什么指针类型,但我们知道大小,而char的权重是最小的,他地址加1只会跳一个字节,当我们知道数据大小时就可以按字节交换,
我们现在就可以理解这段代码了,当p1大于p2时交换p2放在前面,p1小于p2不交换
p1放在前面
妙用指针实现qsort,算法,经验分享,c语言,程序人生,笔记文章来源地址https://www.toymoban.com/news/detail-620672.html

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

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

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

相关文章

  • 用冒泡排序实现快速排序(qsort函数),指针进阶实例

    目录   1、qsort函数是什么 2、冒泡排序实现指针进阶 2.1 主函数 2.2 功能函数声明​编辑 2.3 my_qsort函数介绍 2.4 Swap函数 总结           qsort函数是c语言自带的函数,其功能是实现快速排序。我们来看一下他的参数和返回值:         以上就是qsort的参数和返回值,可以看到,

    2024年02月21日
    浏览(44)
  • 【程序人生】来自拥有 8 年经验的软件工程师的建议 | Advice From a Software Engineer With 8 Years of Experience

    目录 来自拥有 8 年经验的软件工程师的建议 | Advice From a Software Engineer With 8 Years of Experience Practical tips for those

    2024年02月05日
    浏览(55)
  • 【C语言】轻松模拟实现qsort函数

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,我们今天接着上回更新的内容,讲讲我们如何模拟实现自己的qsort函数, 废话不多说,我们开始今天的内容。 关于这方面的内容已经在上篇博客中具体介绍了,这里不再缀叙,感兴趣的话可

    2024年02月16日
    浏览(36)
  • 从排序算法的艺术看C语言qsort函数的魅力:一场数据的时空穿越

    欢迎来到白刘的领域    Miracle_86.-CSDN博客 系列专栏    C语言知识 先赞后看,已成习惯    创作不易,多多支持! 目录 一 、回调函数 二、qsort函数 1.qsort函数排序整型数据 2.qsort函数排序结构数据 何为回调函数?听起来很装逼的样子,实际上它是一个很简单的概念: 回调函

    2024年03月19日
    浏览(50)
  • 『C语言进阶』qsort函数及模拟实现

    🔥 博客主页 : 小羊失眠啦 🔖 系列专栏 : C语言 🌥️ 每日语录 : 没有退路,只能让自己变得强大 ❤️ 感谢大家点赞👍收藏⭐评论✍️ 在上篇指针进阶中,我们对函数指针、函数指针数组、函数指针数组指针以及回调函数有了一定的了解,文章末尾简单的对qsort函数进

    2024年02月07日
    浏览(43)
  • 【C语言】回调函数(qsort)与模拟实现

    何思何虑,居心当如止水;勿取勿忘,为学当如流水。— 出自《格言联璧·学问类》 解释:无思无虑,心境应当平静如水;不求冒进也不忘记,学业当如流水一般永无止境。 这篇博客我们将会理解回调函数这个概念,以及借用qsort帮助理解,并且最终用qsort的思路来实现冒泡

    2024年02月16日
    浏览(46)
  • 【C语言】剖析qsort函数的实现原理

    主页:17_Kevin-CSDN博客 专栏:《C语言》 本文将从回调函数,qsort函数的应用,qsort函数的实现原理三个方面进行讲解,请自行跳转至相对位置进行阅读~  目录 回调函数 qsort函数的应用 qsort函数实现原理 回调函数实际上是一个指针,指向的是一个函数。它作为一个参数传递给

    2024年03月14日
    浏览(35)
  • 掌握指针进阶:探索字符指针、数组指针和指针数组的妙用

    💓博客主页:江池俊的博客 ⏩收录专栏:C语言进阶之路 👉专栏推荐:✅C语言初阶之路 ✅数据结构探索 💻代码仓库:江池俊的代码仓库 ​🎪 社区:GeekHub社区 ​ 🎉欢迎大家点赞👍评论📝收藏⭐ 指针的主题,其实我在初阶指针《【C语言】指针----初阶》章节就已经接讲

    2024年02月12日
    浏览(35)
  • c语言用冒泡排序模拟实现qsort排序

    1、简单介绍冒泡排序 冒泡排序就是两两相邻元素进行比较,如果不满足顺序就进行交换。现有一组整数,将其用冒泡排序实现排序为升序。 假设有这样一组整数:9 8 7 6 5    由此可知,如果一个整型数组有num个元素,则需走num-1趟,若走在第i趟,则在第i趟内需要比较num-1

    2024年02月15日
    浏览(47)
  • C语言库函数之 qsort 讲解、使用及模拟实现

    我们在学习排序的时候,第一个接触到的应该都是冒泡排序,我们先来复习一下冒泡排序的代码,来作为一个铺垫和引入。 代码如下: 很简单的一种排序方法,但我们可以发现一个问题,那就是冒泡排序不够通用,它只能用于整型数组的排序,如果我要排序float类型,或者排

    2024年02月12日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包