qsort () 库函数

标准库

C标准库------>   

 声明

void __cdecl qsort(void *_Base, size_t _NumOfElements, size_t _SizeOfElements,     _CoreCrtNonSecureSearchSortCompareFunction _CompareFunction)
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

这两个是一样的 

参数 

第一个void 代表了qsort() 不返回任何值

__cdecl 是用来声明在动态链接库里面的函数原型,一般不用管

------------------------------------------------------------------------------------

第一个参数是 你要排序的数组的地址,或者是数组第一个元素的地址

第二个参数是  你要排序的元素个数

第三个参数是 排序的每个元素的大小---单位为字节

第四个参数是 比较两个元素的函数或者是它的地址(函数指针)

比较函数 

qsort可以对结构体、一维int数组、二维int数组、一维字符数组、二维字符数组排序

是因为接收参数时用void * 指针接收,所有其它类型的指针都可以隐式转换为空类型指针 ,而空类型指针只存储地址的值,没有类型,在需要的时候可以强制类型转换成特定的类型,这样就可以对不同类型排序了

当然还有核心,就是比较函数,在什么时候需要改变两个元素的位置呢 ?这就是比较函数完成的事 记住比较函数的参数一定是const void *类型的,因为在头文件定义中就是这样,如若不然,就会报错

int compare_int(const void * a, const void * b) 
{
	
	int *a1 = (int*)a;
	int *b1 = (int*)b;

	return (*a1) - (*b1);
}

这个函数只能用来比较两个int 变量 也就是当参数 是这个函数时,可以对int一维数组排序

 如果compar_int返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的前面 如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定 如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的后面

 具体使用

排序一个一维int 数组

#include 
#include 

using namespace std;

int compare_int(const void * a, const void * b) 
{
	
	int *a1 = (int*)a;
	int *b1 = (int*)b;

	return (*a1) - (*b1);
}
int main(void)
{

	int arr[] = { 85,64,14,28,99,42,20,1,57,98,74 };
	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int),&compare_int);
	//qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), compare_int); //或者是没有&,因为函数名就是函数的地址

	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		cout << arr[i] << " ";
	}

	return 0;
}

你可能感兴趣的:(c语言)