快速排序qsort讲解

news2024/11/28 4:37:03

        hello大家好,我是c语言boom家宝,今天为大家分享的博客内容是qsort快速排序,简称快排的一个知识点的讲解。

        在讲到快排之前,允许博主先提一嘴冒泡排序。大家在c语言的学习过程中,冒泡排序是必不可少会学习到的一个思想,那么冒泡排序是怎么样的呢?我们看代码:

int main() {
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(int);
	for (i = 0; i < sz - 1; i++) {  //一共要交换多少次数
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++) {  //每一次交换的元素个数
			if (arr[j] > arr[j + 1]) {
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}

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

        这样就完成一个冒泡排序啦,非常的简单。但是冒泡排序简单是简单,可是效率十分的低。它通过重复很多次的挨个比较,然后交换的方式达成最后的排序效果。如果数组内容非常非常的多呢?那么排序所用的时间将会非常的多。其次,上面的这个冒泡排序只适用于排序整型。如果我又需要对其他类型的数据排序,如浮点型,字符型等,那么就需要重新写一个冒泡排序的代码,十分的复杂。基于这几点原因,所以博主将讲解一下qsort快速排序的使用:

 

        库函数qsort,快排,适用于任何类型数据的排序。使用时需要引用<stdlib.h>头文件
博主在官网上查询qsort的使用方法,它们是这样介绍的:如图

        我们再来看一下使用qsort库函数需要调用的参数是什么

        那么qsort函数的返回值是什么,如图:

         也就是说如果p1指向的元素值小于p2指向的元素值,返回一个小于0的数。反之,返回一个大于0的数。如果相等,则返回0.

        总结一下,当我们要使用qsort库函数的时候,需要传的参数如下。他们各自表示的意思也有打在备注里面,方便大家理解。如果不知道什么是函数指针,请移步链接:http://t.csdn.cn/FtRCn,博主有在里面对函数指针进行讲解,这很重要,因为要想使用qsort库函数,必须要创建一个函数指针才可以。

void qsort(void* base,   //指向了需要排序的数组的第一个元素
           size_t num,   //排序的元素个数
           size_t size,  //一个元素的大小,单位是字节
           int (*cmp)(const void*,const void*)  //函数指针类型,
                               //这个函数指针指向的函数,需要能够比较base指向数组中的两个元素
          );


        细心的阅读朋友会发现,这个函数指针的参数部分类型是const void*类型。而void*这个类型有一些特殊,void*不能直接进行解引用操作,也不能直接进行指针的运算。但是,void*指针是无具体类型的指针,它可以接收任意类型的地址。这一点就十分妙哉,因为我们在使用函数过程中并不会提前知道你具体会传过来什么类型的参数。如果还像上面冒泡排序一样,那么就写死了,就只能完成一个类型数据的排序。 既然不能直接解引用,那我们就可以在使用的时候把它强制转换成我们需要的类型。具体实现如下:

#include <stdio.h>
#include <stdlib.h>

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

void test1() {
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(int);
     //qsort默认排的是升序
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < 10; i++) {
		printf("%d ", arr[i]);
	}
}
int main() {
	
	test1();
	
	return 0;
}

        qsort默认是排成升序,如果想排成降序,我们只需要把上述代码中的return(*(int*)p1 - *(int*)p2);改成return(*(int*)p2 - *(int*)p1);就可以了。上述代码编译结果如下

        当然,前面也说到过,qsort可以排序任何一个类型的。博主这里再举例用qsort来排序结构体又是怎么排序的呢?代码如图

        我们只需要按照格式去传参数,然后写一个函数指针就可以了。qsort有着十分高效的效率,各位阅读朋友可以自己尝试一下去写一个快排出来 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka - Primie Number of Partitions Issue Consumer Group Rebalance

文章目录 生产者&#xff1a;将数据写入 Kafka 的客户端。 消费者&#xff1a;从 Kafka 中读取数据的客户端。 Topic&#xff1a;Kafka 中用于组织和存储数据的逻辑概念&#xff0c;类似于数据库表。 Record&#xff1a;发送到 Topic 的消息称为 Record。 Partition&#x…

基于深度学习的高精度交通信号灯检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度交通信号灯检测识别可用于日常生活中检测与定位交通信号灯目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的交通信号灯目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…

斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 13 Neural Nets and Deep Learning

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 13 Neural Nets and Deep Learning In this chapter, we shall consider the design of neural nets, which are collections of perceptrons, or nodes, where the outputs of one rank (or lay…

C# 学习笔记

不再是学生了&#xff0c;成了社畜了&#xff0c;公司主要技术栈是C# 大一时候学C#学的很迷糊&#xff0c;总要重新学一下 入职已经20天了&#xff0c;也开始上手简单增删改查了 记录了一些C#相关的东西&#xff0c;只是还没有系统整理 WinForm 控件命名规范 ADO.NET 连接…

爬虫-微博个人主页的获取

我们在利用爬虫爬取微博个人主页的时候&#xff0c;我们需要获取到个人页面的cookie才能进入到微博的个人主页&#xff0c;否则的话将会是一直跳转到登录页面而导致不能进入个人主页。 import urllib.request url #自己微博个人主页的源代码 headers {User-Agent:Mozilla/5.…

办公软件ppt的制作

毕业找工作太难了&#xff0c;赶紧多学点什么东西吧&#xff0c;今天开始办公软件ppt的制作学习。 本文以WPS作为默认办公软件&#xff0c;问为什么不是PowerPoint&#xff0c;问就是没钱买不起&#xff0c;绝对不是不会破解的原因。 一.认识软件 在快捷工具栏中顾名思义就是一…

什么是框架?为什么要学框架?

一、什么是框架 框架是整个或部分应用的可重用设计&#xff0c;是可定制化的应用骨架。它可以帮开发人员简化开发过程&#xff0c;提高开发效率。 项目里有一部分代码&#xff1a;和业务无关&#xff0c;而又不得不写的代码>框架 项目里剩下的部分代码&#xff1a;实现业务…

机器学习:Bert and its family

Bert 先用无监督的语料去训练通用模型&#xff0c;然后再针对小任务进行专项训练学习。 ELMoBertERNIEGroverBert&PALS Outline Pre-train Model 首先介绍预训练模型&#xff0c;预训练模型的作用是将一些token表示成一个vector 比如&#xff1a; Word2vecGlove 但是对于…

Qt Creator创建控制台项目显示中文乱码

今天在使用Qt Creator创建c项目的时候显示中文乱码&#xff0c;这里分享一下解决办法&#xff0c;主要是由于我们的电脑大部分是GBK编码格式的是&#xff0c;然后Qt默认创建的一般是utf-8编码类型的。编码类型不一致就会导致中文乱码的现象。 从控制台的属性可以看到我们的程序…

Observability:Synthetic monitoring - 动手实践

在我之前的如下文章里&#xff1a; Observability&#xff1a;Synthetic monitoring - 合成监测入门&#xff08;一&#xff09;&#xff08;二&#xff09; Observability&#xff1a;Synthetic monitoring - 创建浏览器监测&#xff0c;配置单独的浏览器监测器及项目 我详…

基于RASC的keil电子时钟制作(瑞萨RA)(3)----使用J-Link烧写程序到瑞萨芯片

基于RASC的keil电子时钟制作3_使用J-Link烧写程序到瑞萨芯片 概述硬件准备视频教程软件准备hex文件准备J-Link与瑞萨开发板进行SWD方式接线烧录 概述 这一节主要讲解如何使用J-Link对瑞萨RA芯片进行烧录。 硬件准备 首先需要准备一个开发板&#xff0c;这里我准备的是芯片型…

【Node.js 安装】Node.js安装与使用教程

Node.js 安装 Node.js 是什么那什么是运行时 如何安装 Node.jsNode 使用教程 Node.js 是什么 先说结论&#xff0c;Node.js 它是一套 JavaScript 运行环境&#xff0c;用来支持 JavaScript 代码的执行 JavaScript 诞生于 1995 年&#xff0c;几乎是和互联网同时出现&#xf…

leetcode-206.反转链表

leetcode-206.反转链表 文章目录 leetcode-206.反转链表一.题目描述二.代码提交三.易错点 一.题目描述 二.代码提交 代码 class Solution {public:ListNode *reverseList(ListNode *head) {ListNode *temp; // 保存cur的下一个节点ListNode *cur head;ListNode *pre nullptr…

scikit-learn集成学习代码批注及相关练习

一、代码批注 代码来自&#xff1a;https://scikit-learn.org/stable/auto_examples/ensemble/plot_adaboost_twoclass.html#sphx-glr-auto-examples-ensemble-plot-adaboost-twoclass-py import numpy as np import matplotlib.pyplot as plt from sklearn.ensemble import …

【stable diffusion】保姆级入门课程02-Stable diffusion(SD)图生图-基础图生图用法

目录 学前视频 0.本章素材 1.图生图是什么 2.图生图能做什么 3.如何使用图生图 4.功能区域 4.1.提示词区域 4.2.图片提示词反推区域 1.CLIP反推 2.DeepBooru 反推 4.3.图片上传区域 4.4.结果图区域 4.5.缩放模式 4.6.重绘幅度 7.结语 8.课后训练 学前视频 …

【Ranking】50 Matplotlib Visualizations, Python实现,源码可复现

详情请参考博客: Top 50 matplotlib Visualizations 因编译更新问题&#xff0c;本文将稍作更改&#xff0c;以便能够顺利运行。 1 Ordered Bar Chart 有序条形图有效地传达项目的排名顺序。但是&#xff0c;将图表上方的指标值相加&#xff0c;用户将从图表本身获得准确的信息…

制造业想要数字化转型应该从哪方面入手?

制造业可以通过关注以下几个关键领域来开启数字化转型之旅&#xff1a; 数据收集和分析&#xff1a;实施系统收集和分析来自各种来源&#xff08;例如机器、传感器和生产过程&#xff09;的数据至关重要。这些数据可以提供有关运营效率、质量控制和预测性维护的见解。 物联网&…

Flask Bootstrap 导航条

(43条消息) Flask 导航栏&#xff0c;模版渲染多页面_U盘失踪了的博客-CSDN博客 (43条消息) 学习记录&#xff1a;Bootstrap 导航条示例_bootstrap导航栏案例_U盘失踪了的博客-CSDN博客 1&#xff0c;引用Bootstrap css样式&#xff0c;导航栏页面跳转 2&#xff0c;页面两列…

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

文章目录 前言曾经学的冒泡排序存在着一些局限性首先第一步&#xff1a;写一个main()函数&#xff0c;分装一个test1函数test1函数 用来描写类型的性状 在test1创建了bubble_int 函数&#xff0c;下一步就是实现它&#xff0c;分两步走步骤一&#xff1a;写函数参数步骤二&…

Matlab论文插图绘制模板第107期—标签散点图

在之前的文章中&#xff0c;分享了Matlab散点图绘制模板&#xff1a; 进一步&#xff0c;再来分享一种特殊的散点图&#xff1a;标签散点图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载。有需…