用c语言多种实现快速排序(有完整代码带注释)

2023-05-16

快速排序是一种把大问题分成小问题的算法。它的目的是把一个无序的数组变成有序的数组。

它的思想如下:

  1. 首先选择数组的第一个数作为“中间值”。

  1. 然后把数组分成两半,左边的数都比中间值小,右边的数都比中间值大。

  1. 对左边和右边的数组分别再重复上面的步骤,直到数组的大小为1。

这个算法是通过不断分治的方法来解决问题的。我们把一个大的无序数组分成若干个小的无序数组,再对每个小的数组使用快速排序算法,最终使得整个数组变得有序。

#include<stdio.h>

//交换两个数的值
void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

//划分数组,使得小于pivot的数在左边,大于pivot的数在右边
int partition(int arr[], int low, int high)
{
    int pivot = arr[high];   //选取最后一个数作为pivot
    int i = (low - 1);   //i指向第一个数
    for (int j = low; j <= high - 1; j++)
    {
        if (arr[j] <= pivot)   //如果当前数小于等于pivot,则交换
        {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);   //最后交换pivot和i+1
    return (i + 1);   //返回pivot的位置
}

//快速排序
void quickSort(int arr[], int low, int high)
{
    if (low < high)   //如果数组不为空,则继续排序
    {
        int pi = partition(arr, low, high);   //得到pivot的位置
        quickSort(arr, low, pi - 1);   //对左边数组进行排序
        quickSort(arr, pi + 1, high);   //对右边数组进行排序
    }
}

int main()
{
    int arr[] = {10, 7, 8, 9, 1, 5};   //要排序的数组
    int n = sizeof(arr) / sizeof(arr[0]);   //数组长度
    quickSort(arr, 0, n - 1);   //快速排序
    printf("Sorted array: \n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    return 0;
}
#include<stdio.h>

// 函数:交换两个数的值
void swap(int *a, int *b) {
  int temp = *a;  // 用临时变量存储 a 的值
  *a = *b;        // 将 b 的值赋给 a
  *b = temp;      // 将临时变量的值赋给 b
}

// 快速排序算法
void quick_sort(int arr[], int left, int right) {
  int i, j, pivot;  // 定义循环变量和 pivot
  
  // 判断左边的索引是否小于右边的索引
  if (left < right) {
    i = left;        // 从左边开始遍历
    j = right + 1;   // 从右边开始遍历
    pivot = arr[left];  // 定义 pivot 为左边的数
    
    do {
      // 找到第一个比 pivot 大的数的位置
      do i++; while (arr[i] < pivot);
      // 找到第一个比 pivot 小的数的位置
      do j--; while (arr[j] > pivot);
      // 如果 i 大于等于 j,说明两个位置的数交换位置
      if (i < j) swap(&arr[i], &arr[j]);
    } while (i < j);  // 循环知道 i 大于等于 j
    
    // 交换 pivot 和 j 的值,使 pivot 所在位置分隔数组为两部分
    swap(&arr[left], &arr[j]);
    
    // 对 pivot 前面的部分继续进行快速排序
    quick_sort(arr, left, j - 1);
    // 对 pivot 后面的部分继续进行快速排序
    quick_sort(arr, j + 1, right);
  }
}

int main() {
  int arr[] = {5, 1, 9, 4, 6, 2, 8, 3, 7};  // 定义要排序的数组
    int n = sizeof(arr) / sizeof(arr[0]); // 计算数组的大小

    // 执行快速排序
    quick_sort(arr, 0, n - 1);
    
    // 输出排序后的数组
    printf("Sorted array: \n");
    for (int i = 0; i < n; i++) {
    printf("%d ", arr[i]);
    }
    printf("\n");
    
    return 0;
}

/*该程序实现了快速排序算法。首先,它定义了一个交换两个数值的函数 `swap()`。然后,它定义了快速排序函数
 `quick_sort()`,该函数对传递的数组进行排序。最后,在 `main()` 函数中,它定义了要排序的数组,并调用了快速排序函数对该数组进行排序,最后输出了排序后的数组。*/
#include <stdio.h>

/* 分割数组的函数,用于在快速排序中获取分割点的位置 */
int partition(int arr[], int low, int high)
{
    int pivot = arr[high];    // 以最后一个数为分割点
    int i = (low - 1);        // 小于分割点的数的索引

    /* 遍历数组中的元素 */
    for (int j = low; j <= high - 1; j++) {
        /* 如果当前元素小于等于分割点,交换位置 */
        if (arr[j] <= pivot) {
            i++;
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }

    /* 将分割点放置在正确的位置 */
    int temp = arr[i + 1];
    arr[i + 1] = arr[high];
    arr[high] = temp;

    /* 返回分割点的索引 */
    return (i + 1);
}

/* 快速排序的实现,递归地对数组进行排序 */
void quick_sort(int arr[], int low, int high)
{
    if (low < high) {
        /* 获取分割点的索引 */
        int pivot_index = partition(arr, low, high);

        /* 递归地对左半边进行快速排序 */
        quick_sort(arr, low, pivot_index - 1);

        /* 递归地对右半边进行快速排序 */
        quick_sort(arr, pivot_index + 1, high);
    }
}

/* 程序的主函数 */
int main()
{
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("排序前的数组:\n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    quick_sort(arr, 0, n - 1);

    printf("排序后的数组:\n");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}

/*在上面的代码中,我们实现了快速排序的算法。首先我们创建了一个 partition 函数,该函数用于将数组分割为两个子数组,一个是小于等于分割点的数,另一个是大于分割点的数。在快速排序中,通过调用 partition 函数,我们可以递归地对数组进行排序。

最后,在 main 函数中,我们创建了一个数组,并使用快速排序将其排序,最后输出结果。*/

快速排序是一种非常高效的排序算法,因为它具有平均线性的时间复杂度。它的时间复杂度在最坏情况下仍然是线性的,但平均情况下要好得多。一般而言,快速排序是时间复杂度为O(nlogn)的排序算法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用c语言多种实现快速排序(有完整代码带注释) 的相关文章

  • opencv摄像头 vmware虚拟机无法打开摄像头的解决方法

    WARN 0 global io opencv modules videoio src cap v4l cpp 887 open VIDEOIO V4L2 dev video0 can 39 t open camera by index C
  • Windows10系统安装Linux虚拟机(Ubuntu)详细图文教程

    在学习Linux系统编程时由于没有多余的电脑于是想到了使用虚拟机来安装Liunx系统环境 在翻阅了诸多教程后 xff0c 选择了免费的VM VirtualBox虚拟机 顺便写了一下虚拟机使用流程以及系统安装教程供初学者参考 1 下载虚拟机O
  • Ubuntu 18.04开启SSH远程服务

    Ubuntu 18 04开启SSH远程服务 准备环境具体操作注意事项 准备环境 ubuntu18 04 系统 具体操作 ubuntu默认不会开启SSH服务 xff0c 未安装或者无法安装的VM tools工具的虚拟机编辑或者复制配置文件将会
  • 结构体空间对齐和结构体数组的使用

    今天在学习linux的platform总线时 xff0c 设备对资源的描述用到了结构体数组 xff0c 以前从没见过 如下 很明显用结构体数组主要是用来给一系列相同类型的结构体赋值 xff0c 主要是来看内存分配问题 首先是结构体的内存分配
  • hypermesh-ABAQUS联合仿真关于一维单元方向的问题。

    在hypermesh中创建的一维单元导入到abaqus中后往往会报错 xff1b 显示方向有问题 xff0c 可以在property模组下 xff0c 选择图示红圈内定义一维单元方向
  • 命令执行各种绕过总结

    最近做了题目很多都有命令执行的 xff0c 这里给自己做一次总结 xff0c 也给大家一个参考 这里我感觉对于大家经典rce中可能会收获不少东西 xff0c 祝愿大家在ctf的道路上越走越远 目录 linux绕过 1 空格绕过 2 关键字绕
  • un7.23:Linux——在CentOS7上安装MySQL5.7。

    虚拟机的存在不仅让服务器更加稳定 xff0c 而且还大大提高了数据库的稳定性 xff0c 所以现在有很多开发人员将代码放到虚拟机上进行开发 xff0c 那么我们应该如何在虚拟机上安装数据库呢 xff1f 一 启动网卡 1 查看虚拟机ip 命
  • C语言爱心代码,红爱心送给您~爱心源码分享

    include lt stdio h gt include lt stdlib h gt int main int argc char argv float x y a for y 1 5 y gt 1 5 y 0 1 for x 1 5
  • <JDBC> 批量插入 的四种实现方式:你真的get到了吗?

    x1f6d2 本文收录与专栏 xff1a JDBC 专栏 x1f4e2 专栏目的是解释JDBC的关键点 xff0c 与各位一路同行 xff0c 会持续输出 xff0c 欢迎免费订阅 xff01 xff01 总有人间一两风 xff0c 填我十
  • <C++> 基于多态的职工管理系统(纯手写含源码)

    x1f6d2 本文收录于专栏 xff1a 大战C 43 43 x1f525 x1f4e2 专栏目的是对于C 43 43 的讲解 xff0c 重点的逐个击破 xff0c 会持续输出 xff0c 欢迎免费订阅 xff01 xff01 x1f35
  • <C++>解密 构造函数和析构函数

    x1f6d2 本文收录于专栏 xff1a 大战C 43 43 x1f4e2 专栏目的是对于C 43 43 的讲解 xff0c 重点的逐个击破 xff0c 会持续输出 xff0c 欢迎免费订阅 xff01 xff01 x1f354 彩蛋 xf
  • <C++> 一文详解 - 运算符重载

    x1f6d2 本文收录于专栏 xff1a 大战C 43 43 x1f4e2 专栏目的是对于C 43 43 的讲解 xff0c 重点的逐个击破 xff0c 会持续输出 xff0c 欢迎免费订阅 xff01 xff01 x1f354 彩蛋 xf
  • <C++>一文拿捏:文件操作

    x1f6d2 本文收录于专栏 xff1a 大战C 43 43 x1f4e2 专栏目的是对于C 43 43 的讲解 xff0c 重点的逐个击破 xff0c 会持续输出 xff0c 欢迎免费订阅 xff01 xff01 x1f354 彩蛋 xf
  • 关于Ubuntu20.04文件系统思考

    文章目录 问题产生Ubuntu文件系统中普通用户可读写地址Ubuntu文件系统Ubuntu文件系统详解一级目录二级目录 查找Ubuntu中软件安装位置Ubuntu修改文件权限 问题产生 使用electron框架开发桌面端跨平台软件时 xff
  • <JDBC>事务处理的剖析,及四种隔离级别

    x1f6d2 本文收录与专栏 xff1a JDBC 专栏 x1f4e2 专栏目的是解释JDBC的关键点 xff0c 与各位一路同行 xff0c 会持续输出 xff0c 欢迎免费订阅 xff01 xff01 抬头向前看 目录 事务处理 x1f
  • 牛客网刷题记录 || 指针

    x1f6d2 本文收录于专栏 xff1a 牛客网刷题记录 x1f4e2 专栏目的是对于刷题过程的记录 xff0c 题型的列举和讲解 xff0c 会持续输出 xff0c 欢迎免费订阅 xff01 xff01 这是牛客网刷题记录专栏第一篇博文
  • 猿创征文|<JDBC>多种开源数据库连接池

    x1f6d2 本文收录与专栏 xff1a JDBC 专栏 x1f4e2 专栏目的是解释JDBC的关键点 xff0c 与各位一路同行 xff0c 会持续输出 xff0c 欢迎免费订阅 xff01 xff01 注定要去的地方 xff0c 多晚都
  • 牛客网刷题记录 || 链表

    这是牛客网刷题记录专栏第一篇博文 xff0c 先给大家简单介绍一下牛客网 xff0c 牛客网是一个集笔面试系统 题库 课程教育 社群交流 招聘内推于一体的优质网站 xff0c 牛客网题库中包含几万道题目 xff0c 注重通过边学边练的模式揽
  • 牛客网刷题记录 || C++入门

    这是牛客网刷题记录专栏第五篇博文 xff0c 先给大家简单介绍一下牛客网 xff0c 牛客网是一个集笔面试系统 题库 课程教育 社群交流 招聘内推于一体的优质网站 xff0c 牛客网题库中包含几万道题目 xff0c 注重通过边学边练的模式揽

随机推荐

  • 牛客网刷题记录 || 结构体和类

    这是牛客网刷题记录专栏第五篇博文 xff0c 先给大家简单介绍一下牛客网 xff0c 牛客网是一个集笔面试系统 题库 课程教育 社群交流 招聘内推于一体的优质网站 xff0c 牛客网题库中包含几万道题目 xff0c 注重通过边学边练的模式揽
  • 牛客网刷题记录 || 运算符与分支

    这是牛客网刷题记录专栏第六篇博文 xff0c 先给大家简单介绍一下牛客网 xff0c 牛客网是一个集笔面试系统 题库 课程教育 社群交流 招聘内推于一体的优质网站 xff0c 牛客网题库中包含几万道题目 xff0c 注重通过边学边练的模式揽
  • 牛客网刷题记录 || 循环

    这是牛客网刷题记录专栏第七篇博文 xff0c 先给大家简单介绍一下牛客网 xff0c 牛客网是一个集笔面试系统 题库 课程教育 社群交流 招聘内推于一体的优质网站 xff0c 牛客网题库中包含几万道题目 xff0c 注重通过边学边练的模式揽
  • 2021年互联网大厂的中秋仪式感

    中秋节快到了 xff0c 就想起来去年互联网大厂的月饼礼盒大比拼 xff0c 来给大家盘点一下2021年互联网大厂的中秋礼盒 xff0c 等今年礼盒出了再一起看看 xff0c 咱吃不到 xff0c 就多看看 xff0c 提前祝大家中秋节快乐
  • Git从入门到项目实战,一篇文章吃透Git

    博主今天刚学完Git就来总结笔记了 xff0c Git好强大 xff0c 不愧是目前世界上最先进的分布式版本控制系统 即使再小的帆也能远航 目录 x1f50e Git版本控制 x1f525 常见版本控制工具 x1f525 版本控制分类 x1
  • Linux gzip gunzip(压缩与解压缩)命令

    gzip xff1a 压缩命令 格式 xff1a gzip 源文件 xff08 不保留源文件 xff09 例 xff1a 格式 xff1a gzip r 目录 xff08 只能压缩目录下的文件 xff0c 不能压缩目录 xff09 例 xf
  • 猿创征文|Spring5梦开始的地方:入门必看

    x1f6d2 本文收录与专栏 xff1a Spring5 专栏 x1f4e2 专栏目的是记录学习攻克难点 xff0c 与各位一路同行 xff0c 会持续输出 xff0c 欢迎免费订阅 xff01 xff01 阅己 xff0c 越己 xff0
  • 2022年互联网大厂的中秋仪式感

    续上篇2021年互联网大厂的中秋仪式感 xff0c 最新的2022年互联网大厂中秋仪式感来了 目录 中秋礼盒 x1f96e 创新乐知阿里巴巴腾讯字节跳动京东网易百度新浪美团哔哩哔哩小红书华为小米大疆知乎快手 中秋礼盒 x1f96e 创新乐知
  • 结构体的冒泡排序

    C 数组允许定义可存储相同类型数据项的变量 xff0c 结构是 C 编程中另一种用户自定义的可用的数据类型 xff0c 它允许您存储不同类型的数据项 首先要先定义结构体类型 xff0c 再定义相应的结构体变量 xff0c 定义结构体类型的一
  • ftp外网访问小知识

    ftp是一种处于应用层的用于文件传输的协议 是基于TCP协议的应用层协议 xff0c 用于在网络上传输文件 ftp协议较其他网络协议更为复杂 xff0c 与一般的C S应用不同点在于 xff1a 一般的C S应用程序只会建立一个Socket
  • Mybatis_plus使用自定义sql 查询并分页时,sql后自己添加LIMIT ? OFFSET?

    64 Select IPage lt Map gt select String batchId String type String tableName Page lt T gt page Page lt DLGMetaDataField
  • C语言程序设计课后习题:利润问题

    题目 xff1a 使用switch 或者 if 语句完成 注 xff1b 此代码没有问题但在qinglen下不会通过 企业发放的奖金根据利润提成 利润 I 低于或等于100000元时 奖金可提10 xff1b 利润高于100000元 低于2
  • Ubuntu显示lines 1-14/14(end)

    Ubuntu下载MySQL xff0c 运行MySQL时 xff0c 终端显示这个 xff0c 一直退出不了 xff0c 我查了之后以为是要你输入密码 xff0c 结果不行 xff0c 然后搜到按q键退出 xff0c md
  • 3Dslicer在windows下源码编译源码并打包程序亲测可用

    对于医疗图像数据可视化有一些比较成熟的开源软件库 xff0c 其中包括volview 2011年已经停止维护和更新 xff0c MITK xff08 德国非中科大版 xff09 xff0c 3Dslicer和ITK SNAP 3Dslice
  • mysql 8.0以上重置密码

    命令行都要以管理员运行 1 xff1a net stop mysql 停止mysql服务 2 xff1a mysqld console skip grant tables shared memory 启动MySQL服务的时候跳过权限表认证
  • 硬件iic与软件iic的正确使用

    MCU中常见的通讯方式 xff1a USART SPI CAN 485 Bluetooth WIFI 4G xff0c 而IIC是除这些外另一种通讯方式 对于STC的MCU只能用软件IIC xff0c 对于stm8和stm32的MCU可以用
  • Linux连接外网

    1 右键虚拟机 xff0c 选择设置 2 点击网络适配器 xff0c 选择NAT模式 xff0c 点击确认 xff0c 返回 3 点击右上角区域 xff0c 点击小圆圈有钳子样的图标 xff0c 进入设置界面 xff0c 点击网络并打开 4
  • C基础 输入一个日期判断是否为闰年 并计算是这一年的第几天

    1 首先要搞清闰年的判断方法 闰年 xff1a xff08 1 xff09 如果year能够被4整除 xff0c 但是不能被100整除 xff0c 则year是闰年 xff08 2 xff09 如果year能够被400整除 xff0c 则y
  • C语言经典题目50题

    程序1 题目 xff1a 有1 2 3 4个数字 xff0c 能组成多少个互不相同且无重复数字的三位数 xff1f 都是多少 xff1f 1 程序分析 xff1a 可填在百位 十位 个位的数字都是1 2 3 4 组成所有的排列后再去 掉不满
  • 用c语言多种实现快速排序(有完整代码带注释)

    快速排序是一种把大问题分成小问题的算法 它的目的是把一个无序的数组变成有序的数组 它的思想如下 xff1a 首先选择数组的第一个数作为 中间值 然后把数组分成两半 xff0c 左边的数都比中间值小 xff0c 右边的数都比中间值大 对左边和