C语言实现快速排序

什么是快速排序?

快速排序(Quick Sort) 是一种高效的分治法排序算法。它通过选择一个基准元素,将数组分成小于基准的部分和大于基准的部分,然后递归地对这些部分进行排序,最终将它们合并起来,完成排序。

快速排序的步骤

1、选择枢轴(基准元素):从待排序的数组中选择一个元素作为枢轴。常见的选择方式是取第一个元素、最后一个元素、随机元素或通过三数取中法选择中间值作为枢轴。

2、划分操作:将数组中的元素按照与枢轴的大小关系进行划分,将小于等于枢轴的元素放在枢轴的左侧,大于枢轴的元素放在枢轴的右侧。这一步骤通常使用双指针法来实现,即从数组的两端同时向中间遍历,交换不符合条件的元素,直到两个指针相遇。

3、递归排序:对划分后的左侧子数组和右侧子数组分别进行递归调用快速排序算法,重复上述步骤,直到子数组的长度为1或为空,即无法再继续划分。

4、合并结果:当递归调用完成后,所有的子数组都已经有序。最后,将左侧子数组、枢轴元素和右侧子数组依次合并起来,即可得到完整的有序数组。

举例说明

假设我们有以下待排序的数组:[49, 38, 65, 97, 76, 27, 13, 49]

1、选择基准: 选择数组的第一个元素 49 作为基准。

2、分割: 将数组分割成两部分,小于 49 的部分为 [38, 27, 13],大于 49 的部分为 [65, 97, 76, 49]。

3、递归排序: 对小于基准的部分 [38, 27, 13] 进行递归排序。
            选择基准: 在小于部分中,选择第一个元素 38 作为基准。
            分割: 分割后,小于 38 的部分为 [27, 13],大于 38 的部分为空。
            递归排序: 对小于 38 的部分 [27, 13] 进行排序,得到 [13, 27]。

4、递归排序: 对大于基准的部分 [65, 97, 76, 49] 进行递归排序。
            选择基准: 在大于部分中,选择第一个元素 65 作为基准。
            分割: 分割后,小于 65 的部分为 [49],大于 65 的部分为 [97, 76]。
            递归排序: 对小于 65 的部分 [49] 进行排序,得到 [49]。
            递归排序: 对大于 65 的部分 [97, 76] 进行排序,得到 [76, 97]。

5、合并: 将小于基准的部分 [13, 27]、基准 38、大于基准的部分 [49] 合并,得到 [13, 27, 38, 49]。

6、合并: 将小于基准的部分 [13, 27, 38, 49]、基准 49、大于基准的部分 [65, 97, 76] 合并,得到 [13, 27, 38, 49, 65, 97, 76]。

最终,数组 [49, 38, 65, 97, 76, 27, 13, 49] 经过快速排序变为有序数组 [13, 27, 38, 49, 65, 76, 97, 49]。

示例代码

#include <stdio.h>// 快速排序算法
void QuickSort(int A[], int low, int high);// 划分函数:将数组划分为两个子数组
int Partition(int A[], int low, int high);// 交换数组中的两个元素
void Swap(int A[],int a,int b);// 打印数组元素
void PrintfArray(int A[], int length);int main()
{int arr[] = {49, 38, 65, 97, 76, 27, 13, 49};int length = sizeof(arr) / sizeof(arr[0]);int i;QuickSort(arr, 0, length - 1);printf("排序后的数组:");PrintfArray(arr,length);return 0;
} 划分函数的实现
//int Partition(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)
//	{
//		int pivotpos = Partition(A, low, high);  // 划分数组
//		QuickSort(A, low, pivotpos - 1);  // 对枢轴左侧子数组进行快速排序
//		QuickSort(A, pivotpos + 1, high);  // 对枢轴右侧子数组进行快速排序
//	}
//}// 划分函数的实现
// 参数:
//   A: 数组
//   start: 子数组的起始索引
//   end: 子数组的结束索引
// 返回值:
//   划分后枢轴的索引位置// 规则:如果当前元素小于基准数时,首先分割指示器右移一位;
// 在A的基础之上,如果当前元素下标大于分割指示器下标时,当前元素和分割指示器所指元素交换 
int Partition(int A[], int start, int end)
{if(start==end)return start;int pivot=start; // 选择第一个元素作为枢轴int zoneIndex=start-1; // 将小于枢轴的元素放在左侧区域Swap(A,pivot,end); // 将枢轴元素放到最右侧int i;for(i=start; i<=end; i++) // 将小于等于枢轴的元素移到左侧区域{if(A[i]<=A[end]){zoneIndex++;if(i>zoneIndex)Swap(A,i,zoneIndex);}}return zoneIndex;  // 返回枢轴的最终位置
}// 快速排序算法的实现
// 参数:
//   A: 数组
//   start: 子数组的起始索引
//   end: 子数组的结束索引
void QuickSort(int A[], int start, int end)
{int zoneIndex=Partition(A,start,end);  // 划分数组if(zoneIndex>start)QuickSort(A,start,zoneIndex-1); // 对枢轴左侧子数组进行快速排序if(zoneIndex<end)QuickSort(A,zoneIndex+1,end);  // 对枢轴右侧子数组进行快速排序
}// 交换数组中的两个元素
// 参数:
//   A: 数组
//   a, b: 需要交换的元素索引
void Swap(int A[],int a,int b)
{int temp;temp=A[a];A[a]=A[b];A[b]=temp;
}// 打印数组元素
// 参数:
//   A: 数组
//   length: 数组长度
void PrintfArray(int A[],int length)
{int i=0;for(i=0; i<length; i++){printf("%d ",A[i]);}printf("\n");
}

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

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

相关文章

【广州华锐视点】VR警务教育实训系统模拟真实场景进行实践训练

随着科技的发展&#xff0c;虚拟现实技术在教育领域得到了广泛的应用。VR警务教育实训系统就是其中的一种应用&#xff0c;该系统由广州华锐互动开发&#xff0c;可以模拟真实的警务场景&#xff0c;让学生通过虚拟现实技术进行实践训练&#xff0c;提高学生的实践能力和技能水…

.NET6使用微信小程序授权登录,获取手机号

1.在appsettings配置你的小程序配置信息 //微信小程序信息配置"WechatConfig": {"appid": "", //小程序ID"secret": "" //小程序秘钥},2.请求接口时先获取Access_token #region 获取小程序的Access_tokenpublic object GetA…

Linux:shell脚本循环语句

目录 一、循环含义 二、echo命令 三、for 3.1.将1到100累加求和 3.2批量添加用户 3.3 根据IP地址检查主机状态 四、 while 和 until 4.1 猜价格 4.2 1-100求和 一、循环含义 循环含义 将某代码段重复运行多次&#xff0c;通常有进入循环的条件和退出循环的条件 重复…

视频汇聚平台EasyCVR视频监控播放平台WebRTC流地址无法播放的问题解决方案

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多…

Linux的ln命令

ln是link的缩写,在Linux中 ln 命令的功能是为某一个文件在另外一个位置建立一个同步的链接&#xff0c;当我们需要在不同的目录&#xff0c;用到相同的文件时&#xff0c;我们不需要在每一个需要的目录下都放一个必须相同的文件&#xff0c;我们只要在某个固定的目录&#xff0…

Ubuntu18.04.4裸机配置

下载虚拟机Ubuntu18.04.4 链接&#xff1a;https://pan.baidu.com/s/1jyucyUSXa9-Fw9ctuU87hA 提取码&#xff1a;o42a –来自百度网盘超级会员V5的分享 VMware选择镜像安装 设置你的用户名&#xff0c;就像windows上登录用户一样简单 下一步……下一步……如此简单 下载…

Floyd(多源汇最短路)

Floyd求最短路 给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 再给定 k 个询问&#xff0c;每个询问包含两个整数 x 和 y&#xff0c;表示查询从点 x 到点 y 的最短距离&#xff0c;如果路径不存在&#xff0c;则输出 impo…

每日一题 33搜素旋转排序数组(二分)

题目 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], ..., nums[n-1], nums[0], nums[…

Fortinet数据中心防火墙及服务ROI超300%!Forrester TEI研究发布

近日&#xff0c;专注网络与安全融合的全球网络安全领导者 Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;联合全球知名分析机构Forrester发布总体经济影响独立分析报告&#xff0c;详细阐述了在企业数据中心部署 FortiGate 下一代防火墙&#xff08;NGFW&#xff09…

Django图书商城系统实战开发-实现商品管理

Django图书商城系统实战开发 - 实现商品管理 在本教程中&#xff0c;我们将使用Django框架来实现一个简单的图书商城系统&#xff0c;并重点讨论如何实现商品管理功能。此外&#xff0c;我们还将介绍如何使用Markdown格式来写博客&#xff0c;并将其集成到我们的图书商城系统中…

缓存淘汰算法(LFU LRU FIFO)及进程的状态和转换

目录 一、缓存淘汰算法 1.LFU&#xff08;Least Frequently Used&#xff09;最近最不常用算法 2.LRU&#xff08;Least Recently User&#xff09;最近最少使用算法 3.FIFO&#xff08;First in first out&#xff09;先进先出算法 二、进程的状态和转换 1.最基本的三种状…

OpenCV图像处理——模版匹配和霍夫变换

目录 模版匹配原理实现 霍夫变换霍夫线检测 模版匹配 原理 实现 rescv.matchTemplate(img,template,method)import numpy as np import cv2 as cv import matplotlib.pyplot as pltimgcv.imread(./汪学长的随堂资料/6/模板匹配/lena.jpg) templatecv.imread(./汪学长的随堂资…

UniApp 使用命令创建页面的详细指南

系列文章目录 文章目录 系列文章目录前言一、安装Uni-CLI二、创建页面三、页面创建命令四、页面结构五、页面使用总结 前言 UniApp是一款跨平台的前端框架&#xff0c;可以用于开发同时运行在多个平台&#xff08;如微信小程序、H5、App等&#xff09;的应用程序。本文将详细介…

系统架构设计师---考试通关练习题

第一章 系统架构设计师概述 1 .以下()不是现代信息系统的架构的三个要素。 A.构件 B.模式 C.规划 D.属性 解析:现代信息系统的架构有三个要素,即构件、模式和规划。 答案:D 2. 软件系统架构是关于软件系统的结构、行为和()的高级抽象。 A.构件 B.模式 C…

centos-stream-9 centos9 配置国内yum源 阿里云源

源配置 tips: yum配置文件路径 /etc/yum.repos.d/centos.repo 1.备份源配置 [Very Important!]mv /etc/yum.repos.d/centos.repo /etc/yum.repos.d/centos.repo.backup2.Clean Cache: yum clean all3.Backup the Old CentOS-Base.repo If exist this file.cd /etc/yum.repos.…

使用chatGPT-4 畅聊量子物理学(三)

集合了人类智慧的照片&#xff0c;来自 1927 年举行的第五届索尔维国际会议。 Omer 什么是“物理系统在被测量之前不具有确定的属性。量子力学只能预测给定测量的可能结果的概率分布" ChatGPT 这句话描述了量子力学中的一种基本原则&#xff0c;即“物理系统在被测量之前…

手写线程池的过程与思考

线程池的抽象接口 public interface SelfThreadPool {// 提交任务到线程池void execute(Runnable runnable);//关闭void shutdown();//获取线程池初始化的大小int getInitSize();//获取线程池最大的大小int getMaxSize();// 获取线程池核心线程数量,int getCoreSize();// 获取…

世微AP2813 平均电流双路降压恒流驱动器 LED储能电源驱动指示灯IC 可恒流可爆闪 可双路恒流

产品描述 AP2813 是一款双路降压恒流驱动器,高效率、外围简单、内置功率管&#xff0c;适用于 5-80V 输入的高精度降压 LED 恒流驱动芯片。内置功率管输出最大功率可达12W&#xff0c;最大电流 1.2A。AP2813 一路直亮&#xff0c;另外一路通过 MODE1 切换全亮&#xff0c;爆闪…

利用OpenCV光流算法实现视频特征点跟踪

光流简介 光流&#xff08;optical flow&#xff09;是运动物体在观察成像平面上的像素运动的瞬时速度。光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系&#xff0c;从而计算出相邻帧之间物体的运动信息的一种方法。…

大模型PEFT技术原理(二):P-Tuning、P-Tuning v2

随着预训练模型的参数越来越大&#xff0c;尤其是175B参数大小的GPT3发布以来&#xff0c;让很多中小公司和个人研究员对于大模型的全量微调望而却步&#xff0c;近年来研究者们提出了各种各样的参数高效迁移学习方法&#xff08;Parameter-efficient Transfer Learning&#x…