如何写出优雅的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

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型