C语言qsort函数使用方法详解

目录
  • 1.qsort函数
    • 1.1qsort函数功能
    • 1.2参数介绍
  • 2.qsort函数功能测试
  • 3.冒泡排序思想模拟实现qsort

1.qsort函数

void qsort (void* base, size_t num, size_t size,

int (compar)(const void,const void*));

1.1qsort函数功能

可以排序任何数据类型

对 所指向的数组元素进行排,使用函数确定顺序。

此函数使用的排序算法通过调用指定函数并指向元素的指针作为参数来比较元素。

该函数不返回任何值,但通过对所定义的数组元素进行重新排序来修改所指向的数组的内容。

1.2参数介绍

base : 是待排序数据的起始地址

size_t num: 待排序数据的元素个数

size_t size:待排序数据元素的大小(单位)

int (compar)(const void, const void*):比较两个元素大小的函数指针

int (compar)(const void, const void*)

将两个指针p1和p2作为参数(均转换为常量 void*)。该函数通过返回(以稳定和传递的方式)来定义元素的顺序:

返回值 意义
<0 p1指向 的元素小于p2 指向 的元素
0 p1指向 的元素等于p2 指向 的元素
>0 p1指向 的元素大于p2 指向 的元素

2.qsort函数功能测试

qsort函数排序整形数据的实现

#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* p1, const void* p2)//比较两个整形的大小
//p1和p2代表两个整形的指针
{
	//p1和p2是两个要比较元素的地址
	//if (*(int*)p1 > *(int*)p2)
	//	return 1;
	//else if (*(int*)p1 < *(int*)p2)
	//	return -1;
	//else
	//	return 0;
	//简化
	return (*(int*)p1 - *(int*)p2);//表示升序
	//return (*(int*)p2 - *(int*)p1);//如果表示降序只需调换p1和p2的位置
}
void print(int arr[], int sz)//函数调用打印排序好的数组
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print(arr, sz);
	return 0;
}

打印结果

qsort函数排序结构体数据

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stu                        //创建结构体
{
	char name[20];
	int age;
};
int cmp_name(const void* p1, const void* p2)  //比较两个名字大小
{
	return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}
void print(struct stu *s, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d\n", s[i].name, s[i].age);
	}
}
void test()
{
	struct stu s[] = { {"zhangsan",20},{"lisi",55},{"wangwu",40} };
	int sz = sizeof(s) / sizeof(s[0]);
	//按照名字比较
	qsort(s, sz, sizeof(s[0]), cmp_name);
	print(s, sz);
}
int main()
{
	test();
	return 0;
}

这里是按照名字记性比较,名字的首字母进行比较,明显z>w>l,大家可以试一试一按照年龄进行比较

3.冒泡排序思想模拟实现qsort

#include<stdio.h>
void print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
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++;
	}
}
void bubble_sort(void* base, int sz, int width, int (*cmp)(const void* e1, const void* e2))
{
	int i = 0;
	//趟数
	for (i = 0; i < sz - 1; i++)
	{
		//一趟冒泡排序的过程
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			//cmp函数传参,传两个待比较数据的地址
			{
				//交换
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
				//base的类型为void*,强制转换成char*,这里是一个字节一个字节来交换数据
			}
		}
	}
}
int cmp_int(const void* e1, const void* e2)//比较两个数据的大小
{
	return (*(int*)e1 - *(int*)e2);
}
void test()
{
	int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
	print(arr, sz);
}
int main()
{
	test();
	return 0;
}

qsort底层逻辑是快速排序的方法,bubble_sort是采用冒泡排序的思想

借鉴了qsort的设计思想: 设计了bubble_sort,来实现对任意类型数据的排序

到此这篇关于C语言qsort函数使用方法详解的文章就介绍到这了,更多相关C语言qsort函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言库函数qsort的使用详解

    目录 一.回调函数 二.库函数qsort 三.使用qsort排序整型数组 四.使用qsort排序结构体 1.使用qsort排序结构体中的字符成员 2.使用qsort排序结构体中的整型成员 五.基于冒泡排序的库函数qsort的模拟实现 1.使用改写函数排序整型数组 2.使用改写函数排序结构体中的字符成员 3.对库函数qsort的总结 六.力扣977#中库函数qsort的使用 一.回调函数 C语言库函数中的qsort的是一个回调函数,回调函数就是一个通过函数指针调用的函数.如果把函数的指针(地址)作

  • C语言库函数qsort的使用及模拟实现

    目录 1.qsort函数的介绍 2.qsort实现不同类型数据排序 3.qsort的模拟实现 1.qsort函数的介绍  函数定义: 函数参数 : void* base 待排序的数据的起始位置 size_t num 待排序的数据元素的个数 size_t width 待排序的数据元素的大小,以字节为单位 int (*compar)(const void*,const void*) 是一个函数指针,函数功能是比较 因该排序算法要排序的数据的类型是不同的,比较方法也是有差异的,因此要给使用者提供一个自

  • C语言 使用qsort函数来进行快速排序

    目录 前言 qsort的简单介绍 用qsort实现一个整形类型的排序 用qsort函数实现结构体的排序 qsort函数的实现 前言 今天分享一个库函数 介绍qsort的使用及实现方法 他可以实现不限于整形.浮点型.字符型.自定义等类型的排序 qsort的简单介绍   qsort 头文件 #include <stdlib.h> 格式 void qsort(void* base,size_t num,size_t width,int(__cdecl*compare(const void*,cons

  • C语言库函数中qsort()的用法

    目录 (一)void*  的指针类型是什么? (二)void qsort(void*, size_t, size_t, int ( * )(const void * ,  const void *  ))  该怎么使用该库函数? (三)使用qsort()来排序不同类型的数据  总结: qsort是库函数提供的一种排序方法,我们就简单1了解一下怎么去用,而不去深究它的库函数是怎么写的 qsort是库函数中提供的一种能排序任何类型的数据的一种排序方法,思想是quick sort(快速排序),今天我听

  • C语言中回调函数和qsort函数的用法详解

    目录 回调函数 指向函数指针数组的指针 qsort(qulick sort)-库函数 回调函数 通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数. 回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 举例: #include<stdio.h> void menu() { printf("*************************

  • C语言qsort()函数的使用方法详解

    目录 前言 1.参数含义 1.首元素地址base 2.元素个数num 3.元素大小size 4.自定义比较函数compar 2.使用方式 1.头文件 2.compar的实现 3.整体代码 总结 前言 qsort()函数(quick sort)是八大排序算法中的快速排序,能够排序任意数据类型的数组其中包括整形,浮点型,字符串甚至还有自定义的结构体类型. 1.参数含义 void qsort (void* base, size_t num, size_t size,int (*compar)(cons

  • C语言详细i讲解qsort函数的使用

    目录 qsort 1.int型 2.float型 3.struct型 qsort 功能:Performs a quick sort.(快速排序) 参数:void qsort( void *base, size_t num, size_t width, int (*cmp )(const void *e1, const void *e2 ) ); 头文件:#include <stdlib.h> 用法: 第一个参数待排数组的首元素地址 第二个参数待排数据个数 第三个待排数据中每个参数的大小——单位

  • C语言qsort函数使用方法详解

    目录 1.qsort函数 1.1qsort函数功能 1.2参数介绍 2.qsort函数功能测试 3.冒泡排序思想模拟实现qsort 1.qsort函数 void qsort (void* base, size_t num, size_t size, int (compar)(const void,const void*)); 1.1qsort函数功能 可以排序任何数据类型 对 所指向的数组元素进行排,使用函数确定顺序. 此函数使用的排序算法通过调用指定函数并指向元素的指针作为参数来比较元素. 该

  • C语言memset函数使用方法详解

    C语言memset函数使用方法详解 一.函数原形   void *  memset(void*s, int ch,size_t n) 二.函数作用  将以s内存地址为首的连续n个字节的内容置成ch,一般用来对大量结构体和数组进行清零 三.常见错误 1.搞反了 ch 和 n的位置 对char[20]清零,一定是 memset(a,0,20); 2.过度使用memset 3.其实这个错误严格来讲不能算用错memset,但是它经常在使用memset的场合出现 int fun(strucy someth

  • C语言system函数使用方法详解

    目录 函数接口 作用 返回值 测试代码 参数 MODE命令 color命令 函数接口 _DCRTIMP int __cdecl system( _In_opt_z_ char const* _Command ); system函数已经被收录在标准c库中,头文件为<stdlib.h> 作用 执行系统命令调用命令处理器来执行命令. 如果命令是空指针,则该函数只检查是否有命令处理器可以被此函数使用. 命令非空则调用命令的效果取决于系统和库的实现,并可能导致程序以非标准的方式运行或终止. 补充: 执行

  • Go语言HttpRouter路由使用方法详解

    HttpRouter是一个轻量级但却非常高效的multiplexer.手册: https://godoc.org/github.com/julienschmidt/httprouter https://github.com/julienschmidt/httprouter 用法示例 package main import ( "fmt" "github.com/julienschmidt/httprouter" "net/http" "

  • C语言 操作符#与##使用方法详解

    目录 一.# 运算符 二.## 运算符 三.小结 一.# 运算符 # 运算符用于在预处理期将宏参数转换为字符串 # 的转换作用是在预处理期完成的,因此只在宏定义中有效 编译器不知道 # 的转换作用 用法: #define STRING(x) #x printf("%s\n",STRING(Hello World!)); 下面通过一个示例感受一下: test.c: #include <stdio.h> #define STRING(x) #x int main() { pri

  • C语言实现面向对象的方法详解

    目录 1.引言 2.封装 3.继承 4.多态 4.1 虚表和虚指针 4.2 在构造函数中设置vptr 4.3 继承 vtbl 和 重载 vptr 4.4 虚函数调用 4.5 main.c 5.总结 1.引言 面向对象编程(OOP)并不是一种特定的语言或者工具,它只是一种设计方法.设计思想.它表现出来的三个最基本的特性就是封装.继承与多态.很多面向对象的编程语言已经包含这三个特性了,例如 Smalltalk.C++.Java.但是你也可以用几乎所有的编程语言来实现面向对象编程,例如 ANSI-C.

  • C++中可以接受任意多个参数的函数定义方法(详解)

    能够接受任意多个参数的函数,可以利用重载来实现.这种函数的执行过程类似于递归调用,所以必须要有递归终止条件. #include <iostream> #include <bitset> void print() {} // 递归终止条件.这是必需的. template<typename Type, typename... Types> void print(const Type& arg, const Types&... args) { std::cou

  • 在一个页面重复使用一个js函数的方法详解

    1.给每个拥有相同行为的问题DOM节点一个相同的class类,如question,同时给不同的问题一个不同的标识ID如 id="question1" id="question2"...诸如此. 2.给类.question绑定点击事件,在触发函数里面先判断当前点击的这个类的id,即可知道你要操作的是哪一个问题,然后调用你的那个伸缩函数即可. <!DOCTYPE html> <html> <head lang="en"&

  • 对Python实现累加函数的方法详解

    这个需求比较奇怪,要求实现Sum和MagaSum函数,实现以下功能 Sum(1) =>1 Sum(1,2,3) =>6 MegaSum(1)() =>1 MegaSum(1)(2)(3)() =>6 实际上Sum就是Python自建的sum函数,它支持变参,变参怎么实现,自然是*args,所以很容易写出雏形: Sum def Sum(*args): count = 0 for i in args: count+=i return count 第二个函数就有点皮了,它要求有参数的时候

随机推荐