如何写出优雅的C语言快速排序代码???你不会的这里都有???

2024-08-29 12:18

本文主要是介绍如何写出优雅的C语言快速排序代码???你不会的这里都有???,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如何写出优雅的C语言快速排序代码???你不会的这里都有???

最近,在查找C99标准库的过程中,找到了一个超级好用的快速排序C函数。。。

学会使用后,顺便做点笔记。。。

库函数原型声明如下:

void qsort( void *ptr, size_t count, size_t size,int (*comp)(const void *, const void *) );

Parameters
ptr - pointer to the array to sort
count - number of elements in the array
size - size of each element in the array in bytes
comp - comparison function which returns ​a negative integer value if the first argument is less than the second, a positive integer value if the first argument is greater than the second and zero if the arguments are equivalent.
The signature of the comparison function should be equivalent to the following:

int cmp(const void *a, const void *b);

The function must not modify the objects passed to it and must return consistent results when called for the same objects, regardless of their positions in the array.

整理知识点后发现

,如下:
1 void ptr
2 size_t count
3 size_t size
4 void *
5 const void

6 int (comp) (const void, const void*)

知识点1、4: void ptr
关于void
的知识点,前一篇博客“使用C语言比较两个元素的值,你真的学会了吗???”使用C语言比较两个元素的值,你真的学会了吗???中,已经介绍过了,不在重复做笔记。。。

知识点2、3:size_t count
size_t类型,查找库函数后,做了如下笔记:

size_t can store the maximum size of a theoretically possible object of any type (including array).
size_t声明的变量可存储C语言任意类型可声明对象的最大大小。
看到这里,是不是很牛逼???
平时,使用int,unsigned int,long int,long long int总感觉内存开的不够大,万一内存溢出了,肿么办???

size_t is commonly used for array indexing and loop counting. Programs that use other types, such as unsigned int, for array indexing may fail on, e.g. 64-bit systems when the index exceeds UINT_MAX or if it relies on 32-bit modular arithmetic.
size_t通常用于数组的索引和循环计数。

这个知识点是冷门知识点,嘿嘿。。。

学会使用size_t后,困惑都少了不少。
举例:

#include <stdio.h>
#include <stddef.h>
#include <stdint.h>int main(void)
{const size_t N = 100;int numbers[N];for (size_t ndx = 0; ndx < N; ++ndx)numbers[ndx] = ndx;printf("SIZE_MAX = %zu\n", SIZE_MAX);size_t size = sizeof numbers;printf("size = %zu\n", size);
}

输出结果为:
SIZE_MAX = 18446744073709551615
size = 400

赶紧做笔记。。。

知识点5:const void*
关于const的声明和使用,这里就不多说了。比较麻烦。。。
具体做一点笔记,这里使用const是用于比较两个数的值。加了const后,可保护void*类型变量不会在程序运行时被修改取值。
就这么多吧。。。

示例代码:

/*qsort_ex01.c*/#include <stdio.h>
#include <stdlib.h>
#include <limits.h>int compare_ints(const void* a, const void* b)
{int arg1 = *(const int*)a;int arg2 = *(const int*)b;if (arg1 < arg2) return -1;if (arg1 > arg2) return 1;return 0;
}int ints[] = { -2, 99, 0, -743, 2, INT_MIN, 4 };
int size = sizeof ints / sizof *ints; 
qsort(ints, siz, sizeof(int), compre_ints);
for (int i = 0; i < size; i++) {printf("%d ", ints[i]);
}
printf("\n");

输出结果为:
-2147483648 -743 -2 0 2 4 99

怎么样,是不是用的很顺手。。。

笔记做到这里,也差不多了,未完待续。。。

在这里插入图片描述

这篇关于如何写出优雅的C语言快速排序代码???你不会的这里都有???的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117834

相关文章

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析