排序算法-快速排序法(QuickSort)

news2024/11/18 0:17:25

 排序算法-快速排序法(QuickSort)

1、说明

快速排序法是由C.A.R.Hoare提出来的。快速排序法又称分割交换排序法,是目前公认的最佳排序法,也是使用分而治之(Divide and Conquer)的方式,会先在数据中找到一个虚拟的中间值,并按此中间值将所有打算排序的数据分为两部分。其中小于中间值的数据放在左边,而大于中间值的数据放在右边,再以同样的方式分别处理左右两边的数据,直到排序完为止。操作与分割步骤如下:

假设有n项记录R_{1},R_{2},R_{3},...,R_{n},其键值为K_{1},K_{2},K_{3},...,K_{n}

  1. 先假设K的值为第一个键值。
  2. 从左向右找出键值K_{i},使得K_{i}> K
  3. 从左向右找出键值K_{j},使得K_{j}< K
  4. 如果i< j,那么K_{i}K_{j}互换,并回到步骤2。
  5. 如果i\geqslant j,那么将KK_{j}互相,并以j为基准点分割成左、右两部分,然后针对左、右两边执行步骤1~5,直到左边键值等于右边键值为止。

2、算法分析

  1. 在最好情况和平均情况下,时间复杂度为O(nlog_{2^{}}n)。在最坏情况下就是每次挑中的中间值不是最大就是最小的,其时间复杂度为O(n^{2})
  2. 快速排序法不是稳定排序法。
  3. 在最坏情况下,空间复杂度为O(n),而在最好情况下,空间复杂度为O(log_{2^{}}n)
  4. 快速排序法是平均运行时间最快的排序法。

3、C++代码 

#include<iostream>
using namespace std;

void Print(int tempData[], int tempSize) {
	for (int i = 0; i < tempSize; i++) {
		cout << tempData[i] << "  ";
	}
	cout << endl;
}

void Quick(int tempData[], int tempLeft, int tempRight) {
	int temp;
	int leftIndex;
	int rightIndex;
	int t;
	if (tempLeft < tempRight) {
		leftIndex = tempLeft + 1;
		rightIndex = tempRight;
		while (true) {
			for (int i = tempLeft + 1; i < tempRight; i++) {
				if (tempData[i] >= tempData[tempLeft]) {
					leftIndex = i;
					break;
				}
				leftIndex++;
			}
			for (int j = tempRight; j > tempLeft + 1; j--) {
				if (tempData[j] <= tempData[tempLeft]) {
					rightIndex = j;
					break;
				}
				rightIndex--;
			}
			if (leftIndex < rightIndex) {
				temp = tempData[leftIndex];
				tempData[leftIndex] = tempData[rightIndex];
				tempData[rightIndex] = temp;
			}
			else {
				break;
			}
		}
		if (leftIndex >= rightIndex) {
			temp = tempData[tempLeft];
			tempData[tempLeft] = tempData[rightIndex];
			tempData[rightIndex] = temp;

			Quick(tempData, tempLeft, rightIndex - 1);
			Quick(tempData, rightIndex + 1, tempRight);
		}
	}
}

int main() {
	const int size = 10;
	int data[100] = { 32,5,24,55,40,81,17,48,25,71 };
	//32  5  24  55  40  81  17  48  25  71
	//32  5  24  25  40  81  17  48  55  71
	//32  5  24  25  17  81  40  48  55  71
	//17  5  24  25  32  81  40  48  55  71
	//5  17  24  25  32  81  40  48  55  71
	//5  17  25  24  32  81  40  48  55  71
	//5  17  25  24  32  71  40  48  55  81
	//5  17  25  24  32  55  40  48  71  81
	//5  17  25  24  32  48  40  55  71  81
	//5  17  25  24  32  40  48  55  71  81
	Print(data, size);
	Quick(data, 0, size - 1);
	Print(data, size);
	return 0;
}

输出结果 

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

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

相关文章

整理mongodb文档:副本集成员可以为偶数

个人博客 整理mongodb文档:副本集成员可以为偶数 想了下&#xff0c;仲裁节点还是不想直接说太多&#xff0c;怕有的同学想太多&#xff0c;且本身副本集就偏向运维的&#xff0c;新手基本也没什么权限操作&#xff0c;就不多废话了。 文章概叙 文章从MongoDB是否可以用偶数…

Redis - php通过ssh方式连接到redis服务器

1.应用场景 主要用于使用php通过ssh方式连接到redis服务器&#xff0c;进行一些操作. 2.学习/操作 1.文档阅读 chatgpt & 其他资料 SSH - 学习与实践探究_ssh应用场景 2.整理输出 2.1 是什么 TBD 2.2 为什么需要「应用场景」 TBD 2.3 什么时候出现「历史发展」 TBD 2.4 …

解决mac系统终端无法使用vpn

解决mac系统终端无法使用vpn 换了公司新电脑&#xff0c;以前用vpn都是直接都可以访问&#xff0c;这次换了电脑和vpn&#xff08;这里用的海豚湾&#xff09;就发现访问不了huggingface.co了&#xff0c;无法git clone 下载大模型真的很难受。 解决方法&#xff1a; 查看自…

Maven Eclipse

Eclipse 提供了一个很好的插件 m2eclipse &#xff0c;该插件能将 Maven 和 Eclipse 集成在一起。 在最新的 Eclipse 中自带了 Maven&#xff0c;我们打开&#xff0c;Windows->Preferences&#xff0c;如果会出现下面的画面&#xff1a; 下面列出 m2eclipse 的一些特点&a…

【已编译资料】基于正点原子alpha开发板的第三篇系统移植

系统移植的三大步骤如下&#xff1a; 系统uboot移植系统linux移植系统rootfs制作 一言难尽&#xff0c;踩了不少坑&#xff0c;当时只是想学习驱动开发&#xff0c;发现必须要将第三篇系统移植弄好才可以学习后面驱动&#xff0c;现将移植好的文件分享出来&#xff1a; 仓库&…

第五十二章 学习常用技能 - Global 映射

文章目录 第五十二章 学习常用技能定义数据库定义命名空间Global映射 第五十二章 学习常用技能 定义数据库 创建本地数据库&#xff1a; 登录管理门户。选择系统管理 > 配置 > 系统配置 > 本地数据库。选择创建新数据库以打开数据库向导。输入新数据库的以下信息&a…

libjpeg库

库安装就不说了&#xff0c;我是直接下载编译好的库 Independent JPEG Group (ijg.org) 这个需要自己编译 可以使用的代码 #include <stdio.h> #include <jpeglib.h> #include <stdlib.h>void compress_jpeg(const char* input_filename, const char* outp…

域名,二级域名,局域网自定义域名

什么是域名 域名是互联网上用于标识和定位网站的字符串。它提供了一个易于记忆和使用的方式来访问网站&#xff0c;代替了使用 IP 地址的复杂形式。域名通常由多个部分组成&#xff0c;用点&#xff08;.&#xff09;分隔。 域名的结构是从右向左逐级划分的&#xff0c;每个部…

原理:用UE5制作一个2D游戏

选中资产图片右键--Sprite Actions--Apply Paper2D Texture Settings 制作场景 把它丢到场景里&#xff0c;并把坐标归零 创建图块集tileset 打开新建的tile set&#xff0c;根据最小图块设置最小尺寸单元 选择需要的图块单元&#xff0c;add box 对新建的tile set右键创建til…

UI 自动化测试框架:PO 模式+数据驱动!

1. PO 设计模式简介 什么是 PO 模式&#xff1f; PO&#xff08;PageObject&#xff09;设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Page 类&#xff0c;并以页面为单位来写测试用例&#xff0c;实现页面对象和测试用例的分离。 PO 模式的设计思想与…

msvcp120.dll是什么东西?找不到msvcp120.dll怎么修复?

在计算机技术的世界里&#xff0c;我们经常会遇到各种错误和问题。其中之一就是MSVCP120.dll的丢失。这是一个非常常见的问题&#xff0c;许多用户在运行某些程序时会遇到这个错误。 MSVCP120.dll是什么&#xff1f; MSVCP120.dll&#xff0c;全名是Microsoft Visual C Runti…

Netty深入浅出Java网络编程学习笔记(二) Netty进阶应用篇

目录 四、应用 1、粘包与半包 现象分析 粘包 半包 本质 解决方案 短链接 定长解码器 行解码器 长度字段解码器——LTC 2、协议设计与解析 协议的作用 Redis协议 HTTP协议 自定义协议 组成要素 编码器与解码器 编写测试类 Sharable注解 自定义编解码器能否使用Sharable注解 3、在…

Python jieba库的使用说明

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一、jieba库基本介绍 jieba库概述 jieba是优秀的中文分词第三方库 中文文本需要通过分词获得单个的词语 jieba是优秀的中文分词第三方库&#xff0c;需要额外安…

自动驾驶软件和人工智能

自动驾驶汽车的核心在于其软件系统&#xff0c;而其中的机器学习和深度学习技术是使车辆能够感知、理解、决策和行动的关键。本文将深入探讨这些技术在自动驾驶中的应用&#xff0c;包括感知、定位、路径规划以及道路标志和交通信号的识别。 1. 机器学习和深度学习在自动驾驶中…

10.11 作业

fun.h #ifndef __FUN_H__ #define __FUN_H__#include <iostream>using namespace std;// 定义一个Sofa类 class Sofa { private:string sitting;public:Sofa(); // 无参构造函数Sofa(string s); // 有参构造函数~Sofa(); …

leetcode:169. 多数元素(同归于尽消杀法)

一、题目&#xff1a; 函数原型&#xff1a; int majorityElement(int* nums, int numsSize) 参数解释&#xff1a; int *nums是一个指针&#xff0c;用于接收数组名 int numsSize是数组的元素个数 二、思路&#xff1a; 用同归于尽消杀法&#xff1a; 因为题目条件给出多数元素…

windows创建服务:更新服务信息乱码问题(ChangeServiceConfig)

因为小项目需要创建windows服务&#xff0c;安装微软官方示例一切都挺顺利&#xff0c;代码运行后发现配置的信息在系统里显示乱码。打开注册表发现的确是乱码。这就排除软件读取得问题&#xff0c;而是调用ChangeServiceConfig系统函数写入时就发生了乱码。让我在网上查找了一…

1.4python 引入其他 py 文件或模块_python量化实用版教程(初级)

python 引入其他 py 文件或模块 在 Python 中&#xff0c;我们可以使用 import 语句来引用其他 py 文件中的代码&#xff0c;这样可以避免代码的重复编写&#xff0c;提高代码的复用性和可维护性。 引用其他 py 文件的方式 Python 提供了多种方式来引用其他 py …

Nginx部署前端网页,Nginx搭建静态资源服务器

文章目录 一、准备静态网页二、安装nginx三、部署网页四、显示文件及文件夹目录信息 一、准备静态网页 我们以dlib静态网页为例&#xff0c;使用nginx部署前端网页&#xff1a; 下载地址&#xff1a;http://dlib.net/ 下载完成之后上传至linux服务器。 在docs目录下&#xff…

在 Elasticsearch 中实现自动完成功能 3:completion suggester

在这篇博文中&#xff0c;我们将讨论 complete suggester - 一种针对自动完成功能进行优化的 suggester&#xff0c;并且被认为比我们迄今为止讨论的方法更快。 Completion suggester 使用称为有限状态转换器的数据结构&#xff0c;该结构类似于 Trie 数据结构&#xff0c;并且…