首页 > 编程语言 >快速排序算法-C语言

快速排序算法-C语言

时间:2024-11-24 14:34:38浏览次数:9  
标签:基准值 int C语言 high 算法 low pivot 排序

第一步:实现分区函数

根据题目中的“快速排序”,我们需要实现一个分区函数,这个功能的实现:

  1. 设定基准值 pivot
  2. 使用两个指针 lowhigh,分别从数组的两端向中间移动,进行元素交换。
int part(int A[], int low, int high){
    int pivot = A[low]; // 设定基准值
    while (low < high) { // 循环直到两个指针相遇
        while (low < high && A[high] >= pivot) // 从右边开始向左找第一个小于pivot的数
            --high;
        A[low] = A[high]; // 将找到的数放到左边
        while (low < high && A[low] <= pivot) // 从左边开始向右找第一个大于pivot的数
            ++low;
        A[high] = A[low]; // 将找到的数放到右边
    }
    A[low] = pivot; // 将基准值放到中间
    return low; // 返回基准值的位置
}

第二步:实现快速排序函数

根据题目中的“快速排序”,我们需要递归地对分区后的子数组进行排序。

void Quicksort(int A[], int low, int high){
    if (low < high) { // 如果子数组长度大于1,则继续排序
        int pivotpos = part(A, low, high); // 调用分区函数
        Quicksort(A, low, pivotpos - 1); // 对左子数组排序
        Quicksort(A, pivotpos + 1, high); // 对右子数组排序
    }
}

代码注释

// 分区函数,用于快速排序
int part(int A[], int low, int high) {
    int pivot = A[low]; // 选择最左边的元素作为基准值
    while (low < high) { // 当两个指针没有相遇时继续
        while (low < high && A[high] >= pivot) // 从右向左找第一个小于基准值的元素
            --high;
        A[low] = A[high]; // 将找到的元素放到左边
        while (low < high && A[low] <= pivot) // 从左向右找第一个大于基准值的元素
            ++low;
        A[high] = A[low]; // 将找到的元素放到右边
    }
    A[low] = pivot; // 将基准值放到中间
    return low; // 返回基准值的位置
}

// 快速排序函数
void Quicksort(int A[], int low, int high) {
    if (low < high) { // 如果数组长度大于1,则继续排序
        int pivotpos = part(A, low, high); // 获取基准值的位置
        Quicksort(A, low, pivotpos - 1); // 对左边的子数组进行快速排序
        Quicksort(A, pivotpos + 1, high); // 对右边的子数组进行快速排序
    }
}

变量变化表格

步骤lowhighpivotA[low]A[high]说明
开始05337初始化
第1次循环14332移动high
第2次循环14332交换A[low]和A[high]
第3次循环23312移动low
第4次循环23315移动high
结束22335基准值归位

标签:基准值,int,C语言,high,算法,low,pivot,排序
From: https://blog.csdn.net/qq_52291558/article/details/144007340

相关文章

  • AI嵌入式系统卷积算法优化——卷积核的分段近似
    AI嵌入式系统卷积算法优化——卷积核的分段近似目录引言AI嵌入式系统简介卷积算法在AI中的作用卷积核的分段近似概述定义优点卷积算法优化方法传统卷积算法优化需求分段近似方法详解基本思想分段线性近似分段多项式近似高阶近似方法误差分析数学公式与理论卷积运算......
  • AI嵌入式系统卷积算法优化——分段线性卷积核近似详解
    AI嵌入式系统卷积算法优化——分段线性卷积核近似详解目录引言卷积算法概述2.1卷积运算的基本原理2.2二维卷积的数学表达式嵌入式系统中的卷积计算挑战3.1计算资源限制3.2存储资源限制3.3能耗管理3.4实时性要求分段线性卷积核近似4.1基本概念4.2数学模型4.3......
  • 【算法】【优选算法】前缀和(下)
    目录一、560.和为K的⼦数组1.1前缀和1.2暴力枚举二、974.和可被K整除的⼦数组2.1前缀和2.2暴力枚举三、525.连续数组3.1前缀和3.2暴力枚举四、1314.矩阵区域和4.1前缀和4.2暴力枚举一、560.和为K的⼦数组题目链接:560.和为K的⼦数组题目描述:题目解析......
  • 每日一练:【优先算法】双指针之快乐数(medium)
    1.题目链接:202.快乐数2.题目描述及分析对于一个正整数我们替换为它每个位置上数字的平方和,不断重复这个过程就如上图所示。这里需要补充的是根据鸽巢定理,n个巢穴,n+1个鸽子,,将鸽子都安排进巢穴,那么不管怎么安排,至少有一个有一个巢穴里面鸽数大于1,我们这里取一个超过int......
  • 二分查找-C语言
    二分查找原理1.使用条件:线性表中的记录必须按关键码有序;必须采用顺序存储。 2.基本思想:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键码相等,则查找成功;若给定值小于中间记录的关键码,则在中间记录的左半区继续查找;若给定值大于中间记录的关键码,则在中间记录的......
  • 代码随想录算法训练营第二十五天|LeetCode491.递增子序列、46.全排列、47.全排列II、3
    前言打卡代码随想录算法训练营第49期第二十五天  ○(^皿^)っHiahiahia…首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。今......
  • 平面点排序(一)(结构体专题)
    #include<stdio.h>#include<math.h>typedefstruct{intx;inty;doubledistance;}s;intmain(){intn;scanf("%d",&n);sarr[n];sarr1[n];intt=n;for(inti=0;i<t;i++){sc......
  • 平面点排序(二)(结构体专题)
    #include<stdio.h>//定义结构体s表示坐标点,包含x和y两个整型成员typedefstruct{intx;inty;}s;//自定义比较函数,用于排序intcompare(consts*a,consts*b){if(a->x!=b->x){returna->x-b->x;//按照横坐标升序排序}......
  • 图论最短路算法笔记
    1图的基本操作1.1图的存储图存储有两种方法:邻接表和邻接矩阵。邻接表:g[N][N]={};...memset(g,0x3f,sizeofg);g[u][v]=w;邻接矩阵:inthead[N]={};memset(head,0x3f,sizeofhead);structedge{intpre,to,val;}EDGE[N];inlinevoidaddedge(......
  • 字节 NLP 算法岗一面面试题7道(含解析)
    最近这一两周不少互联网公司都已经开始秋招提前批面试了。不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC在变少,岗位要求还更高了。最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解惑答疑,分享技术面试中的那些弯弯绕绕。总结如下:《大模型面......