C语言快速排序详解

快速排序(快排) (C语言实现) 本篇博客学习内容是快速排序,快速排序有多种不同的版本和优化,我们这次的目的就是将这些版本都搞明白,废话不多说,我们开始。 阅读详情

目录

手敲快速排序

C语言调用标准库实现快速排序


手敲快速排序

#include<stdio.h>

int a[101], n;

void quicksort(int left, int right)
{
    int i, j, t, temp;
    if (left > right)
        return;
    i = left;//左哨兵
    j = right;//右哨兵
    temp = a[left];//基准数
    while (i != j)
    {
        //顺序很重要,要先从右往左找 
        while (a[j] >= a[left] && i < j)
            j--;
        //再从左往右找 
        while (a[i] <= a[left] && i < j)
            i++;
        //交换两个数在数组中的位置
        if (i < j)//当哨兵i和哨兵j没有相遇时
        {
            t = a[i];
            a[i] = a[j];
            a[j] = t;
        }        
    }
    //最终将基准数归位
    a[left] = a[i];
    a[i] = temp;

    quicksort(i + 1, right);//继续处理左边的,这里是一个递归的过程
    quicksort(left, i - 1);//继续处理右边的,这里是一个递归的过程
}

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    quicksort(0, n - 1);
    for (int i = 0; i < n - 1; i++)
        printf("%d ", a[i]);
    getchar();
    getchar();
    return 0;
}

C语言调用标准库实现快速排序

qsort 是 C 语言标准库中的一个函数,用于对数组进行快速排序。它的函数原型为:

cCopy code
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

其中,base 是指向要排序的数组的指针,nmemb 是数组中元素的个数,size 是每个元素的大小(以字节为单位),compar 是指向比较函数的指针。

比较函数 compar 接收两个指向要比较的元素的指针,返回值为整型。当第一个元素小于第二个元素时,返回一个负整数;当第一个元素等于第二个元素时,返回 0;当第一个元素大于第二个元素时,返回一个正整数。

以下是一个使用 qsort 函数对整型数组进行升序排序的例子:

#include <stdio.h>
#include <stdlib.h>
​
int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}
​
int main() {
    int arr[] = {5, 2, 8, 4, 1};
    int n = sizeof(arr) / sizeof(arr[0]);
​
    qsort(arr, n, sizeof(int), compare);
​
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
​
    return 0;
}

输出结果为:1 2 4 5 8。

int n = sizeof(arr) / sizeof(arr[0]);这句代码什么意思

int n = sizeof(arr) / sizeof(arr[0]); 这句代码计算了数组 arr 中元素的个数,并将结果保存在变量 n 中。

在 C 语言中,sizeof 运算符可以用来计算一个变量或类型所占用的字节数。在这里,sizeof(arr) 计算的是整个数组 arr 所占用的字节数,sizeof(arr[0]) 则计算的是数组中第一个元素所占用的字节数。因为数组中所有元素的类型都相同,所以 sizeof(arr[0]) 可以代表数组中所有元素所占用的字节数。

因此,sizeof(arr) / sizeof(arr[0]) 就是计算数组 arr 中元素的个数。这个值可以用来确定需要排序的元素个数,以便在调用 qsort 函数时传递正确的参数。

int compare(const void *a, const void b) { return ((int*)a - (int)b); } 函数参数为什么要用指针

函数参数使用指针的原因是为了避免在函数调用时产生数组的副本,从而减少内存的使用。因为数组在内存中通常是连续存储的,所以可以通过指向数组第一个元素的指针来访问整个数组。

在 compare 函数中,参数 a 和 b 都是 void 类型的指针,这意味着可以传递任何类型的指针作为参数,而不仅仅是整型数组的指针。在函数内部,首先将 a 和 b 转换为 int 类型的指针,然后通过 * 运算符解引用指针,获取指针所指向的元素的值。最后将这两个元素的值相减,得到它们的大小关系。

由于 qsort 函数需要一个比较函数作为参数,而不同类型的数组元素可能需要不同的比较方式,因此 compare 函数使用了 void 类型的指针作为参数,可以适用于不同类型的数组元素。在使用时,只需要根据实际情况将 void 类型的指针转换为相应的类型即可。

函数参数使用指针的原因是为了避免在函数调用时产生数组的副本,从而减少内存的使用。 这样做为什么能避免产生数组的副本

使用指针作为函数参数可以避免产生数组的副本,是因为指针只是保存了数组第一个元素的地址,而不是将整个数组复制到函数的栈空间中。因此,使用指针作为函数参数可以减少内存的使用,从而提高程序的效率。

如果在函数调用时直接传递数组作为参数,那么函数会将整个数组复制到自己的栈空间中,这样会占用大量的内存。而使用指针作为参数,则只需要复制一个指针,指向原数组的第一个元素,这样就可以在函数内部访问整个数组的元素,而不必复制整个数组。

在 compare 函数中,使用指针作为参数可以避免在函数调用时复制整个数组。由于 compare 函数只需要访问数组元素的值,而不需要修改数组元素,所以使用指针作为参数是安全的。

int compare(const void *a, const void b) { return ((int*)a - (int)b); }中的const是什么意思有什么用

const 关键字用于声明一个常量,可以用来修饰函数参数或变量。在 compare 函数中,const 关键字用于修饰函数参数 a 和 b,表示这些指针所指向的内存空间是只读的,不能被修改。

使用 const 关键字有助于提高程序的健壮性和可维护性。在函数中,如果不需要修改函数参数所指向的内存空间,那么就应该将参数声明为 const 类型,这样可以避免无意中修改了这些内存空间的值,从而导致程序出现错误。

在 compare 函数中,使用 const 关键字可以确保函数不会修改数组元素的值,从而保证了函数的安全性。如果不使用 const 关键字,那么在函数中可能会无意中修改数组元素的值,从而影响程序的正确性。

需要注意的是,const 关键字只能保证指针所指向的内存空间不被修改,而不能保证指针本身不被修改。如果需要保证指针本身不被修改,可以使用 const 修饰指针变量。

C语言实现快速排序算法 序 愿天上的每一个流星,都为你而闪耀天际。 嗨,这里是狐狸~~ 今天是 阅读详情

相关推荐

C语言快速排序算法详解:从原理、实现到性能优化

排序算法是计算机科学中的基础核心概念,用于将数据集合按特定顺序重新排列。其核心原理基于比较和交换操作,通过不同的策略实现数据的有序化。在众多排序算法中,快速排序因其高效的平均时间复杂度O(n log n)和原地排序特性而具有重要技术价值,尤其适用于内存受限或处理大规模数据的场景。快速排序采用分而治之策略,通过选取基准值将数组划分为子序列递归排序。本文聚焦于快速排序在C语言中的工程实践,深入探讨基准值选取的艺术(如三数取中法)、分区过程的核心逻辑(双指针挖坑填数),并分析其性能优化策略,如针对小数组的插入排序

weixin_42522964的博客 327

快速排序(C语言)

中文名:快速排序英文名:quick sort时间复杂度:O(nlog2n)稳定性:不稳定性的排序算法(多个相同的值的相对位置在也许会在算法结束后位置发生改变)原理:将数组的第一个(最后一个)数组元素a,作为关键数据,将比a小的数字b放到a的左边(右边),所有比a小的数字b放到a的右边(左边),快速排序是对冒泡排序的的优化。

m0_64681789的博客 1万+

C语言实现冒泡与快速排序算法详解

时间复杂度是衡量算法运行时间长短的指标,它关注的是随着输入数据规模的增长,算法所需的执行时间如何变化。一个算法的时间复杂度通常用大O符号表示,如O(n)、O(n^2)等,其中n表示输入数据的规模。时间复杂度越低,算法的运行效率越高,因为它意味着算法所需的处理时间随输入数据规模增长的速度较慢。

weixin_28721743的博客 937

快速排序

快速排序介绍 快速排序(Quick Sort)使用分治法策略。 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 快速排序流程: (1) 从数列中挑出一个基准值。 (2) 将所有比基准值小的摆放在基准前面,所有比基...

king3wade的博客 827

2024广东省职业技能大赛云计算——集群部署GitLab

题目是这样的:在Kubernetes集群中新建命名空间gitlab-ci,将GitLab部署到该命名空间下,Deployment和Service名称均为gitlab,以NodePort方式将80端口对外暴露为30880,设置GitLab服务root用户的密码为admin@123,将项目包demo-2048.tar.gz导入到GitLab中并命名为demo-2048。GitLab是一个功能强大且灵活的 DevOps 平台,为开发团队和企业提供了从代码管理到持续集成、交付和部署的一整套解决方案。

kuuuugua的博客 4395

论文分享|ECCV2022,PATnet,Cross-Domain Few-Shot Semantic Segmentation,CDFSS新基准,文末有复现教程

这篇论文提出的跨域小样本语义分割(CD-FSS)任务,旨在将源域学习的分割能力迁移到目标域,仅需少量标注样本。针对传统小样本分割方法在跨域场景性能下降的问题,作者提出了基于金字塔锚点变换的网络(PATNet),通过将域相关特征转换为域无关特征,并引入任务自适应微调推理(TFI)提升目标域适应能力。实验表明,PATNet在1-shot和5-shot设置下分别比现有方法提升8.49%和10.61%的准确率。同时,作者构建了CD-FSS基准并设计了任务难度评估指标。代码和数据集已开源,复现难度中等。

m0_74277350的博客 1095

C语言实现快速排序(三种)

第一种: #include<stdio.h> void Swap(int*a,int*b) { int tmp=*a; *a=*b; *b=tmp; } int PartSort1(int* a, int left, int right)//快排 { int keyi = left; while (left < right) { //找小 while (left < right && a[right] >= a[k

m0_62898700的博客 9904

Transformers 中的 Softmax 可以并行加速么?

通过融合前两个计算步骤,降低执行Reduce_max和Reduce_sum等操作的通信开销。利用共享内存来存储临时数据,以减少对全局内存的访问成本。

stephen147的博客 1234

C语言 快速排序——qsort函数详解

还在用冒泡排序吗!来试试万能的快速排序函数吧!

chara9885的博客 2万+

llama.cpp量化模型在MTT显卡上的性能对比:S80/S3000/S4000实测数据

本文基于摩尔线程MTT S80、S3000和S4000三款显卡,对llama.cpp量化模型进行了深度性能实测。报告详细对比了不同量化精度(如Q4_K_M、Q6_K)在Llama 3.2 1B和Qwen 2.5 7B模型上的推理速度、显存占用、功耗及温度表现,为开发者根据硬件选择最优模型配置与参数调优提供了关键数据参考和实战指南。

week9的博客 350

初识YUV,实战NV21格式数据转换为Bitmap

初识YUV,并使用YUV数据生成Bitmap图像一、初识YUV二、采样方式2.1、YUV 4:4:42.2、YUV 4:2:22.2、YUV 4:2:2 一、初识YUV 说到YUV我们就必须先从RGB说起了,如下图所示,请各位把每个色块当成一个像素点。通常一个像素点由RGB(Alpha我们先不考虑)三原色组成。 如下图中第一个像素点,其RGB值分别为(236,102,93),而这三个值就组成了我们看到的 红色 。 然而上图中除了RGB值外,我还标出了每个像素点的YUV的值,YUV的值是怎么来的呢?直接给公

乐翁龙 7125

[C语言实现快速排序算法详解]

快速排序(Quicksort)是一种高效的、基于分治策略的排序算法,由托尼·霍尔(Tony Hoare)于1960年提出。它的基本思想是:通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据小,然后再按此方法对这两部分数据分别进行快速排序,整个过程可以递归进行,以此达到整个数据变成有序序列。快速排序在平均状况下,时间复杂度为O(n log n),而在最坏情况下(如待排序序列已经有序)会退化为O(n2),但通过优化可以极大降低最坏情况出现的概率,因此在实际应用中非常高效。

a1037的博客 427

ransac拟合2D圆(三点定圆 c++详细版)

RANSAC(Random Sample Consensus,随机采样一致性)算法是一种基于随机采样的迭代算法,主要用于从一组包含大量噪声和异常值(外点)的数据中估计数学模型的参数。

twnkie的博客 1047

快速排序C语言详解

学习笔记 编译环境;vc6.0 #include <stdio.h> //*********************快速排序****************** int Partition(int a[], int low, int high) { int pivotkey; //pivotkey枢轴关键字 pivotkey = a[low]; //...

学习笔记,仅供参考 380

46.qt quick-自定义非常好看的qml虚拟软键盘-支持换肤、动态加载移除语言(二)

在上章我们学习了45.qt quick-qml虚拟软键盘详解(一)_诺谦的博客-优快云博客 接下来我们便来自定义一款好看的qml软键盘.如下图所示: 支持背景更换、支持动图: 支持动态加载移除语言: 支持拖拽、自由缩小放大: 支持定位坐标: ...

抵抗时间扭曲,坚持做一件有意义的事 4674

zabbix深度监控之邮件告警、微信群和微信告警

本文详细介绍了Zabbix监控系统实现邮件告警和微信告警的配置方法。邮件告警部分包含QQ和163邮箱的SMTP服务器配置、消息模板设置、告警流程三步骤(媒介配置、触发器动作、用户设置)。微信告警分为两种方式:企业微信群机器人告警(通过webhook实现)和企业微信应用告警(需创建应用并获取API参数)。两种告警方式都提供了完整的配置流程,包括脚本编写、权限设置、消息模板定制等关键步骤,并特别说明了如何使个人微信接收企业微信告警消息。文章还对比了SMTP、POP3、IMAP三种邮件协议的差异及适用场景。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 815

C语言经典排序算法之快速排序(详解)

算法(Algorithm),是程序设计的灵魂,它是利用系统的方法描述解决问题策略的机制。本系列文章旨在用C语言解释算法的作用,分析包括排序算法、查找算法、迭代算法、递推算法、 递归算法、枚举算法、贪心算法、回溯算法、矩阵算法等。

Viewinfinitely的博客 4613

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C语言qsort快速排序函数详解

C语言qsort快速排序函数的基本使用和模拟实现

Raikkonen_love的博客 1247

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C语言:快速排序(详解)

快速排序采用的是两头对比交换。 https://blog.youkuaiyun.com/qq_40941722/article/details/94396010 上面这个连接大家可以点进去看看博客李小白大大的图文解释,我觉得这个是对我启发比较大的,对刚接触快速排序的人来说非常友好,很快就可以了解到其中的原理。 然后我的代码稍微和里博客李小白的稍稍有点不一样; 我在敲代码过程中发现快速排序对条件限制非常严格,我认为如果你对在从左到右扫描的时候,和从右到左扫描的时候那个限制条件理解了,说明你对这个快速排序的的代码才

本散修的一些学习心得与笔记,道友请自便。 4902

快速排序 c语言详解

今天学习了快速排序,凭自己的理解写下的,如果有错误也请各位提出!谢谢!

jxtjiayou的博客 474

快速排序详解!c语言

如果left(begin)先走,如果只有最后一个数字比key大这时begin 和 end 相遇,反而把key换到了最后一个位置,而唯一比key大的数字反而去了第一个,那就不满足,左小右大的原则了。快速排序顾名思义,快速的排序,事实也如此,他的应用面广泛同时确实很快,因为他的时间复杂度是o(nlogn),相比前面的(插入冒泡选择)三小只来说,它的速度确实遥遥领先,但相对的思想也更复杂。为什么要从right开始,因为你的key在数组的第一个位置,所以最后一次和key交换的数据一定要是比key小的。

a1275174052的博客 1112

C语言下快速排序(挖坑法)详解

文章来源: 学习通http://www.bdgxy.com/ 目录全部代码如下挖坑法–>代码讲解–>总结全部代码如下 #include <stdio.h> void evaluation(int *x,int b)//赋值函数 { *x = b; } void Compare(int arr[],int first,int last) { int one = first;//数列第一个元素下标 int end = last;//数列最后一个元素下标 int key = arr[

菜鸟教程 334

快速排序详解--C语言实现

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。    假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它

lvmengmeng 851

快速排序详解(C语言)

#快速排序是对起泡排序的一种改进。 快速排序的基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小, 然后分别对这两部分进行上述排序,直到整个序列有序。 #本博客采用如下顺序存储,0号单元留空 typedef struct { int *r; int length; int listsize; }SqList;//定...

weixin_44711653的博客 695

C语言快速排序(非递归)图文详解

用C语言实现快速排序的非递归,借助了栈模拟了递归的实现。

yao_yao0524的博客 1243

详解C语言的四种排序:冒泡排序、选择排序、插入排序、快速排序

C语言中有三种经典的简单排序:选择排序、冒泡排序、插入排序以及快速排序。总结一下这四种排序。

m0_73613541的博客 1万+
上一篇: if , #if , #ifdef, #ifndef的区别
下一篇: C语言malloc()函数
AryaZ
博客等级 码龄6年 1粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值