排序------快速排序(C语言实现)

news2024/11/15 12:24:42

目录

快速排序算法

例题

题目描述

具体代码:

代码分析

函数定义:

主函数:


快速排序算法

快速排序(QuickSort)是一种高效的排序算法,它采用分治策略,通过选择一个“基准”元素并将其他元素重新排列为两部分,一部分小于基准,另一部分大于基准,然后递归地对这两部分进行排序。快速排序的基本步骤包括:

  1. 选择基准:从数组中选择一个元素作为基准。常见的选择方法有选择第一个元素、最后一个元素、随机选择或中间元素。
  2. 分区:将数组划分为两部分,使得所有小于基准的元素都在基准的左边,所有大于基准的元素都在基准的右边。分区后,基准元素位于其最终排序位置。
  3. 递归排序:对基准元素左边和右边的子数组分别进行快速排序,直到子数组的大小为1或0。

快速排序的平均时间复杂度为O(n log n),但在最坏情况下,如果每次选择的基准元素都导致极端不平衡的划分,时间复杂度会退化到O(n²)。为了避免最坏情况,可以采用随机化选择基准或“三数取中”策略。

空间复杂度方面,快速排序的空间复杂度主要取决于递归调用的栈空间,平均情况下为O(log n)。

快速排序在实际应用中广泛使用,因为它通常比其他O(n log n)算法更快,且在内存使用上是原地排序算法. 

例题

题目描述


快速排序是一种常见的排序方式,但是你知道这个排序是怎么实现的吗?现在要求你不使用库函数,实现快速排序。

输入格式
第一行输入一个整数 n,表示数列的长度。
第二行输入 n 个数,表示数列中的元素。

输出格式
输出 n 个数,表示排好序的数列。

输入输出样例
输入
4
4 3 2 1

输出
1 2 3 4

样例说明
4 3 2 1
排序结束是
1 2 3 4

具体代码:

#include <stdio.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int partition(int arr[], int low, int high) {
    int pivot = arr[high];  // 选择最右端元素作为基准
    int i = (low - 1);  // i为数组小于区域的最后一个索引

    for (int j = low; j <= high - 1; j++) {
        // 当前元素小于或等于pivot
        if (arr[j] <= pivot) {
            i++;    // 增加小于区域的长度
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}

void quickSort(int arr[], int low, int high) {
    if (low < high) {
        // pi是分区后的基准元素索引
        int pi = partition(arr, low, high);

        // 递归排序基准元素左右两侧的子数组
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

int main() {
    int n;
    scanf("%d", &n);
    int arr[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    quickSort(arr, 0, n - 1);

    for (int i = 0; i < n; i++) {
        printf("%d", arr[i]);
        if (i < n - 1) {
            printf(" ");
        }
    }
    printf("\n");

    return 0;
}

代码分析

  1. 函数定义

    • swap:交换两个整数变量的值。
    • partition:选择基准,将数组划分,并返回基准的最终位置。
    • quickSort:递归地进行快速排序。
  2. 主函数

    • 读取输入的n,然后读取n个整数到数组arr中。
    • 调用quickSort函数对arr进行排序。
    • 输出排序后的数组元素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2075025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络面试真题总结(五)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 说一说HTTP1.0&#xff0c;1.1&#xff0c;2.0 的区别 HTTP/1.0 H…

国际篮球联合会(FIBA)标准篮球比赛记录表

相关资源 下载地址>>https://download.csdn.net/download/boomcode/89675132 篮球比赛计时计分展示管理系统开发及使用手册>>

3D渐变的轮播图效果,有点儿意思!

阅读原文&#xff1a;原文地址 一、前言 在Web开发中&#xff0c;轮播图&#xff08;Carousel&#xff09;是一种非常常见的功能&#xff0c;用于展示图片或内容&#xff0c;通过自动或手动的方式切换不同的视图&#xff0c;在网页设计中扮演着重要的角色。 吸引注意力&…

用Python给英语单词批量划分音节

一、问题的缘起 最近&#xff0c;有网友在我的视频下面留言&#xff0c;问我可否把英语单词进行音节的划分&#xff1f;我以前也有同样的想法&#xff0c;但是始终没有得到解决。但是&#xff0c;我想使用python&#xff0c;学习英语的人都很多&#xff0c;说不定有人已经编写…

微信左滑删除聊天记录怎么恢复?记录找回秘籍,第一种更有效!

在日常的指尖滑动间&#xff0c;微信成为了我们生活中不可或缺的一部分&#xff0c;记录着与朋友、家人的温馨对话&#xff0c;以及工作中的重要信息。然而&#xff0c;当不小心的向左滑动&#xff0c;珍贵的聊天记录就会悄然消失。那么&#xff0c;微信左滑删除聊天记录怎么恢…

给儿童掏耳朵用什么工具好?2024四款精品合集汇总

在为儿童掏耳朵时&#xff0c;选择合适的工具非常重要。普通的金属挖耳勺太过坚硬&#xff0c;容易弄伤儿童脆弱的耳道&#xff0c;并不适合。柔软的小棉签虽然相对安全一些&#xff0c;但也只能清理外耳道比较浅处的耳垢&#xff0c;而且若使用不当同样存在风险。 相比之下&am…

大数据驱动的数字化营销策略,开启营销新征程

​在当今这个数字化时代&#xff0c;大数据正以崭新的大力量重塑着企业的营销策略。今天&#xff0c;就让我们一同深入探讨大数据驱动的数字化营销策略究竟有着怎样的魅力。用蚓链获数据资产&#xff0c;享大数据福利&#xff01; 大数据&#xff0c;精准定位目标客户的神器。…

【FPGA】HDMI参数信息汇总

文章列举已知大部分个人电脑屏幕尺寸信息&#xff0c;主要包括720p 1080p 2k 1440p 4k 5k以及8k屏幕。屏幕水平一行包括同步脉冲、后沿间隔、活跃像素、前沿间隔&#xff1b;屏幕垂直包括同步脉冲、后沿间隔、活跃行数、前沿间隔。 1. 720p (1280x720) 水平总像素 (HSYNC): 16…

element-plus 新增一行合计。除了用summary-method还可以用append的插槽

:summary-method"getSummaries" <el-table:data"reformtableData"style"width: 100%"show-summary:summary-method"getSummaries"ref"reformtableRef" > <el-table-column label"序号" type"index…

ArcGIS中怎么批量计算多个点到线最近距离,以及这些点到线的纬度差?

最近&#xff0c;我接到了一个关于批量计算多个点到线最近距离&#xff0c;以及这些点到线的纬度差的咨询。 下面是我对这个问题的解决思路&#xff1a; 先解决的如何计算是纬度差的问题&#xff0c;因为纬度差直接在地理坐标系下计算即可。 1,第一步对线要素转折点 2.接着在…

AI赚钱秘籍:如何利用大模型在2024年轻松月入过万?

随着人工智能技术的飞速发展&#xff0c;大模型已成为推动行业革新的重要力量。2024年&#xff0c;利用大模型技术月入过万已不再是遥不可及的梦想。本文将揭示AI赚钱的秘籍&#xff0c;帮助您在新的一年里通过大模型技术轻松实现月入过万的目标。 一、大模型技术概述 大模型技…

录屏怎么把声音录进去?三个方法让你告别无声录屏!

在数字化交流日益频繁的今天&#xff0c;录屏已经成为我们工作、学习及娱乐中不可或缺的一部分。然而&#xff0c;许多人在录屏时常常发现&#xff0c;尽管画面清晰&#xff0c;但声音却未能同步录制&#xff0c;这极大地影响了视频的完整性和观赏性。别担心&#xff0c;今天我…

超易企业管理系统 ajax/Login.ashx SQL注入致RCE漏洞复现

0x01 产品简介 超易软件作为一家专业从事企业管理软件的高新技术企业,其核心产品超易企业管理系统覆盖了企业日常运营的多个方面,包括进销存管理、仓库管理、销售管理、固定资产管理、人事管理等多个模块。这些模块相互关联,共同构成了一个全面的企业管理解决方案。 0x02 …

示波器输出的csv文件如何转换为频谱图及其excel表格(频率与幅值)

示波器输出的CSV文件通常包含的是采样的时域信号数据&#xff0c;而不是直接的频率和幅度信息。这个文件一般包括时间&#xff08;Time&#xff09;和电压&#xff08;Voltage&#xff09;两列&#xff0c;记录了电压随时间变化的情况。 要从这些时域数据中得到频率和幅度的变…

chapter08-面向对象编程(super)day09

目录 298-super基本语法 299-super使用细节1 300-super使用细节2 301-super使用细节3 298-super基本语法 1、可以访问父类的属性&#xff0c;但是不能访问父类的private属性 2、可以访问父类的方法&#xff0c;但不能访问父类的private方法 3、访问父类的构造器&#xff1a;…

并联去耦电容的反谐振

1 串联谐振与并联谐振 并联谐振是一种电流谐振现象&#xff0c;其中电容器&#xff08;C&#xff09;和电感器&#xff08;L&#xff09;上的电流相互交换&#xff0c;形成谐振状态。在谐振时&#xff0c;电容器和电感器上的电流对外交换为零&#xff0c;电路呈现开路状态&…

文献阅读:Pathway Ensemble Tool癌症途径和治疗法的无偏发现

介绍 正确地识别生物途径的扰动是揭示基本疾病机制和发展急需的治疗策略的关键步骤。然而&#xff0c;目前的工具是否最优化用于无偏发现相关途径仍然不清楚。在这里&#xff0c;我们创建了“基准测试”&#xff08;Benchmark&#xff09;来严格评估现有工具&#xff0c;并发现…

如何禁止编辑PDF文件?推荐两种方法!

在日常工作中&#xff0c;我们经常会遇到需要分享重要的PDF文件的情况&#xff0c;但又希望文件内容不被随意更改。为此&#xff0c;设置PDF文件的修改限制是一个非常有效的措施。今天分享两种常见的禁止修改PDF的方法&#xff0c;一起来看看如何设置。 方法一&#xff1a;使用…

每日Attention学习15——Cross-Model Grafting Module

模块出处 [CVPR 22] [link] [code] Pyramid Grafting Network for One-Stage High Resolution Saliency Detection 模块名称 Cross-Model Grafting Module (CMGM) 模块作用 Transformer与CNN之间的特征融合 模块结构 模块思想 Transformer在全局特征上更优&#xff0c;CNN在…

探索OpenCV:图像处理基础与实践

探索OpenCV&#xff1a;图像处理基础与实践 前言图像读取基础安装OpenCV库读取彩色与灰度图像 RGB颜色模型颜色通道解析单通道图像显示 感兴趣区域&#xff08;ROI&#xff09;图像处理进阶技巧图像打码图像组合图像缩放 结语 前言 在当今数字化时代&#xff0c;图像不仅是我们…