当前位置:主页 > c/c++教程 > C++ qsort函数排序

C++ qsort函数排序与冒泡模拟实现流程详解

发布:2023-03-05 14:30:01 59


给网友朋友们带来一篇相关的编程文章,网友刘德馨根据主题投稿了本篇教程内容,涉及到C++、qsort函数排序、C++冒泡排序、C++ qsort函数排序相关内容,已被412网友关注,涉猎到的知识点内容可以在下方电子书获得。

C++ qsort函数排序

本章重点:

1.能够正确的理解qsort函数各个参数的含义,并能够正确的使用qsort函数进行各类型排序。

2.重点掌握qsort函数中的参数cmpar——自定义比较函数的地址。借此进一步理解回调函数。 3.学习以冒泡排序思想模拟实现qsort函数。

一、qsort排序函数

1、函数功能特点

//头文件:#include
void qsort(void* base, size_t num, size_t size,int (*compar)(const void*, const void*));

注:因为qsort可以对任意类型数据排序,所以待排数据的起始类型可以是任意类型,C语言中可以用void*接收任意类型的地址。

2、函数参数

3、比较函数

qsort之所以可以对任意类型的数据排序正是因为传入的比较函数是相对自定义的:

对于比较函数 int compar(const void *p1,const void *p2)

(1)比较整数:

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

1、如果compar返回值小于0(< 0),即*(MyType*)p1 < *(MyType*)p2那么p1所指向元素会被排在p2所指向元素的前面,也就是升序 。

2、如果compar返回值等于0(= 0),即*(MyType*)p1 = *(MyType*)p2那么p1所指向元素与p2所指向元素的顺序不确定。

3、如果compar返回值大于0(> 0),即*(MyType*)p1 > *(MyType*)p2那么p1所指向元素会被排在p2所指向元素的后面,也是升序。

所以为了方便理解我们可以简单这样认为:对于qsort函数如果compar函数的返回值<0(不进行置换),>0(进行置换),0(不进行置换)。

即:

return *(MyType*)p1 - *(MyType*)p2;——qsort升序排序

return *(MyType*)p2 - *(MyType*)p1;——qsort降序排序

对于具体qsort函数内部具体是怎么进行置换或排序的我们不必关心。(内部实现为快排思想)

(2)比较字符串:

int compareMyType(const void* p1, const void* p2)
{
	return strcmp((MyType *) p1, (MyType *) p2);
}

同理:

return strcmp((MyType*)p1,(MyType*)p2);——qsort升序排序

return strcmp((MyType*)p2,(MyType*)p1);——qsort降序排序

(3)比较结构体

与上述思想类似,比较结构体时需要具体情况具体分析。

4、测试qsort排序

(1)测试qsort函数排序整形

#include
#include
//输出函数
void print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
//比较函数
int compar(const void* e1, const void* e2)
{
	return *((int*)e1) - *((int*)e2);//升序
	//return *((int*)e2) - *((int*)e1);//降序
}
int main()
{
	int arr[] = { 3,5,2,6,8,1,9,0,4,7 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//arr-数据起始地址
	//sz-数据元素个数
	//sizeof(arr[0])-数据元素的大小
	//compar-比较函数指针
	qsort(arr, sz, sizeof(arr[0]), compar);
	print(arr, sz);
	return 0;
}

(2)测试qsort函数排序结构体


参考资料

相关文章

  • C++面向对象中构造函数使用详解

    发布:2023-03-06

    学习过C语言的小伙伴知道:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题,这篇文章主要介绍了C++面向对象中构造函数使用


  • C++中小数点输出格式(实例代码)

    发布:2023-01-05

    给大家整理了关于C++的教程,下面小编就为大家带来一篇C++中小数点输出格式(实例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧


  • C++之值传递&指针传递&引用传递的示例详解

    发布:2023-03-06

    这篇文章主要为大家详细介绍了C++中值传递、指针传递和引用传递的定义与使用,文中的示例代码讲解详细,对我们学习C++有一定帮助,需要的可以参考一下


  • C++设计与声明超详细讲解

    发布:2023-03-02

    C++软件开发可以理解为设计一系列的类,让这些类相互使用,最终实现我们所需要的功能。类与类之间的相互关系可以很复杂,也可以很简单,如何简单高效的描述类与类之间的关系是设计的难点之一。遵循本文所提供的方法,将会给你一些灵感


  • C++无痛实现日期类的示例代码

    发布:2023-03-04

    凡是要写类必须要提到六大默认成员(六位大爷):构造函数、析构函数、拷贝构造函数、赋值重载函数、取地址重载函数(包括const对象和普通对象);那么这次的日期类又需要伺候哪几位大爷呢?本文就来详细说说


  • C++和Java命令行绘制心形图代码分享

    发布:2020-04-21

    这篇文章主要为大家详细介绍了C++和Java命令行绘制心形图案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • C++ Boost Bimap示例详细讲解

    发布:2023-03-09

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称


  • Lua和C/C++互相调用实例分析

    发布:2022-06-23

    给网友们整理关于C++的教程,今天小编就为大家分享一篇关于Lua和C/C++互相调用实例分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧


网友讨论