zl程序教程

您现在的位置是:首页 >  其它

当前栏目

库函数 qsort 的用法

用法 库函数 qsort
2023-09-11 14:20:20 时间

qsort是一个库函数

基于快速排序算法实现的一个排序的函数

语法

void qsort(
   void *base,
   size_t number,
   size_t width,
   int(*cmp)( const void* e1 , const void* *e2)
);

参数

base  

目标数组的函数。

number

元素中的数组大小。

width

元素大小(字节)。

cmp

指向用户提供的例程的指针比较两个数组元素,并返回指定它们关系的值。

注解

  qsort 在排序过程中一次或多次调用 cmp例程,并将指针传递给每个调用中的两个数组元素。 如果 cmp 表示两个元素相同,则它们在生成的排序数组中的顺序是

    数组按比较函数中定义的升序进行排序。 若要以降序对数组进行排序,请反转比较函数中的“大于”和“小于”的意义,即 e1和e2调换

比较函数返回值

说明

<0e1<e2
0e1=e2
>0e1>e2

规定

头文件    <stdlib.h>

示例

1,模仿qsort的功能实现一个通用的冒泡排序

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int cmp_int(const void* e1, const void* e2)
{
	return (*(int*)e1 - *(int*)e2);
}

void test2()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	//排序为升序
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);
}

int main()
{
	test2();
	return 0;
}

void qsort(void* base, 
	       size_t num, 
	     size_t width, 
	int(*cmp)(const void* e1, const void* e2)
           );

2.使用库函数,qsort排序各种类型的数据

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stu
{
	char name[20];
	int age;
	double score;
};

//int cmp_stu_by_age(const void* e1, const void* e2)
//{
//	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
//}

int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp( ((struct stu*)e1)->name , ((struct stu*)e2)->name );
}

void test3()
{
	struct stu arr[3] = { {"zhangsan",20,55.5},{"lisi",30,88.0},{"zhaowu",10,90.0} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);
	
}

void swap(char* buf1, char* buf2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}

int main()
{
	test3();
	return 0;
}
void qsort(void* base, 
	       size_t num, 
	     size_t width, 
	int(*cmp)(const void* e1, const void* e2)
           );