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

相关文章

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +