快速排序算法的代码及算法思想

快速排序(Quick Sort)是一种常用的排序算法,他的时间复杂度为O(nlogn)

算法思想:

通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据小,然后再对这两部分数据分别进行快速排序,递归地重复此过程,直到整个序列有序。

#include <stdio.h>

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

// 快速排序函数
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        // 基准元素的索引
        int pivotIndex = partition(arr, low, high);
        
        // 对基准元素左侧的子数组进行快速排序
        quickSort(arr, low, pivotIndex - 1);
        
        // 对基准元素右侧的子数组进行快速排序
        quickSort(arr, pivotIndex + 1, high);
    }
}

// 分割函数,选取基准元素并调整元素位置
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++;
            swap(&arr[i], &arr[j]);
        }
    }
    
    // 将基准元素放到合适的位置
    swap(&arr[i + 1], &arr[high]);
    
    // 返回基准元素的索引
    return i + 1;
}

// 测试例子
int main() {
    int arr[] = {10, 7, 8, 9, 1, 5};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    printf("原始数组:\n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    quickSort(arr, 0, n - 1);

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

运行以上代码,输出结果为:

52199c403c254cd781cf004421fa1583.jpg

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

换抵挡装置(按位运算符的运用)

给出两个长度分别为n1&#xff0c;n2&#xff08;n1 n2 <32)且每列高度只为1或2的长条&#xff08;保证高度为1的地方水平上一致&#xff09;。需要将它们放入一个高度为3的容器长度&#xff0c;问能够容纳它们的最短容器长度 用手画的 本来是n1&#xff0c;n2 < 100的…

[操作系统] 文件管理

文章目录 5.1 磁盘调度算法1. 先来先服务算法( First Come First Served, FCFS) 算法2. 最短寻道时间优先算法( Shortest Seek Time First, SSTF) 算法3. 扫描算法( SCAN ) 算法4. 循环扫描算法( Circular Scan, CSCAN ) 算法5. LOOK 与 CLOOK 算法 5.2 进程写文件时&#xff0…

全汉电源SN生产日期解读

新买了一个全汉的电脑电源&#xff0c;SN&#xff1a;WZ3191900030&#xff0c;看了几次没想明白&#xff0c;最后估计SN是2023年19周这样来记录日期的。问了一下京东全汉客服&#xff0c;果然就是这样的。那大家如果在闲鱼上看到全汉电源&#xff0c;就知道它的生产日期了。

键入网址到网页显示,期间发生了什么?(计算机网络)

浏览器首先会对URL进行解析 下面以http://www.server.com/dir1/file1.html为例 当没有路径名时&#xff0c;就代表访问根目录下事先设置的默认文件&#xff0c;也就是 /index.html 或者 /default.html 对URL进行解析之后&#xff0c;浏览器确定了 Web 服务器和文件名&#x…

C语言错误处理之 “<errno.h>与<error.h>”

目录 前言 错误号处理方式 errno.h头文件 error.h头文件 参数解释&#xff1a; 关于的”__attribute__“解释&#xff1a; 关于“属性”的解释&#xff1a; 实例一&#xff1a; 实例二&#xff1a; error.h与errno.h的区别 补充内容&#xff1a; 前言 在开始学习…

MySQL如何处理并发访问和高负载?

在当今互联网时代&#xff0c;面对日益增长的数据量和用户访问量&#xff0c;数据库的并发访问和高负载处理变得尤为重要。MySQL作为最流行的关系型数据库管理系统之一&#xff0c;具备许多关键技术和策略来处理并发访问和高负载&#xff0c;下面将对其进行深入探讨。 ​ 图片…

【doccano】文本标注工具——属性级情感分析标注自己的业务数据

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【doccano】文本标注工具——属性级情感分析标注自己的业务数据 1.说明2.前提条件3.doccano创建项目4.添加数据集5.添加标签6.标注数据7.导出数据转换格式 1.说明 2.前提条件 确保doccano已经安装完成 可以参考文…

elk+filebeat+kafka集群部署

EFK实验架构图&#xff1a; 实现高并发&#xff0c;无需指定logstash 3台esfile&#xff0c;3台kafka 20.0.0.10 esfile 20.0.0.20 esfile 20.0.0.30 esfile 20.0.0.11 kafka 20.0.0.12 kafka 20.0.0.13 kafka在es1主机上解压filebeat cd filebeat 安装nginx服务 vim /usr/loc…

JAVA基础进阶(七)

一、集合和数组的区别 集合和数组的区别:数组的长度是固定的,集合的长度是可变的。数组既可以存储基本数据类型&#xff0c;也可以存储引用数据类型。集合只能存储引用数据类型,所以对于基本数据类型byte、short、int等只能存储他们对应的包装类Byte、Short、Integer。 二、集…

初阶C语言-函数

前言 ⭐️此篇博文主要带大家探讨C语言的函数部分的知识点&#xff0c;若有错误&#xff0c;还请佬指出&#xff0c;一定感谢&#xff01; 制作不易&#xff0c;若觉得内容不错可以点赞&#x1f44d;收藏❤️&#xff0c;这是对博主最大的认可&#xff01; &#x1f4da;函数的…

WPF实战项目十八(客户端):添加新增、查询、编辑功能

1、ToDoView.xmal添加引用&#xff0c;添加微软的行为类 xmlns:i"http://schemas.microsoft.com/xaml/behaviors" 2、给项目添加行为 <i:Interaction.Triggers><i:EventTrigger EventName"MouseLeftButtonUp"><i:InvokeCommandAction Com…

maven 基础

maven常用命令 clean &#xff1a;清理 compile&#xff1a;编译 test&#xff1a;测试 package&#xff1a;打包 install&#xff1a;安装 maven坐标书写规范 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</ar…