数据结构之快速排序算法

2023-11-17

快速排序的思想

  • ​设置两个变量i、j,排序开始的时候:令i=0,j=length-1;
  • ​以第一个数组元素作为比较,赋值给temp,即temp=nums[0];
  • ​从j开始向前扫描,找到第一个小于temp的值nums[j],将nums[j]和nums[i]的值交换;
  • 从i开始向后扫描,找到第一个大于temp的值nums[i],将nums[i]和nums[j]的值交换;
  • 重复第3、4步,直到i==j,将枢轴元素移到正确位置上,即将nums赋值给nums[i]。

快速排序的递归实现

int partition(int* nums, int left, int right)
{
	int temp = nums[left];
	while (left < right) 
	{
		while (left < right && temp < nums[right])right--;
		if (left < right)nums[left] = nums[right];
		while (left < right && nums[left] <= temp)left++;
		if (left < right)nums[right] = nums[left];
	}
	nums[left] = temp;
	return left;
}

void quitSort(int* nums, int left, int right)
{
	if (left < right)
	{
		int mid = partition(nums, left, right);
		quitSort(nums, left, mid - 1);
		quitSort(nums, mid + 1, right);
	}
}

int main()
{
	int nums[] = { 56,23,78,45,90,89,12,34,56,67,89,100 };
	int n = sizeof(nums) / sizeof(nums[0]);
	quitSort(nums, 0, n - 1);
	for (int i = 0; i < n; i++)
	{
		printf("%2d ", nums[i]);
	}
}

快速排序的非递归实现

void PrintInt(int* ar, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%5d", ar[i]);
	}
	printf("\n");
}

int partition(int* nums, int left, int right)
{
	int temp = nums[left];
	while (left < right)
	{
		while (left < right && temp < nums[right])right--;
		if (left < right)nums[left] = nums[right];
		while (left < right && nums[left] <= temp)left++;
		if (left < right)nums[right] = nums[left];
	}
	nums[left] = temp;
	return left;
}

//借助队列或者栈进行操作
void QuitSort(int* nums, int left, int right)
{
	std::queue<int>qu;
	qu.push(left);
	qu.push(right);

	while (!qu.empty())
	{
		int sleft = qu.front(); qu.pop();
		int sright = qu.front(); qu.pop();
		int mid = partition(nums, sleft, sright);
		if (sleft < mid)
		{
			qu.push(sleft);
			qu.push(mid-1);
		}
		else if(mid<sright)
		{
			qu.push(mid+1);
			qu.push(sright);
		}
	}
}

int main()
{
	int ar[] = { 56,23,78,45,90,89,12,34,56,67,89,100 };
	int n = sizeof(ar) / sizeof(ar[0]);
	PrintInt(ar, n);
	QuitSort(ar, 0, n - 1);
	PrintInt(ar, n);
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构之快速排序算法 的相关文章

随机推荐

  • hashmap中为什么使用红黑树?

    在回答这个问题之前 我们先了解一下有关二叉树的基本内容 二叉排序树 又称二叉查找树 1 若左子树不为空 则左子树上所有结点的值均小于根结点的值 2 若右子树不为空 则右子树上所有结点的值均大于根节点的值 3 左右子树也为二叉排序树 平衡二叉
  • 2017 ICCV之语义分割:Cascaded Feature Network for Semantic Segmentation of RGB-D Images

    Cascaded Feature Network for Semantic Segmentation of RGB D Images 目前的问题 1 为了计算对象 场景关系的表示 最近大量的分割网络使用一组感受野来丰富卷积特征的文本信息 这
  • book_read_link

    结构性改革 黄奇帆 微信读书 分析与思考 黄奇帆的复旦经济课 黄奇帆 微信读书
  • java通过web3j获取ETH交易明细

    我们在项目里面如果想要得到用户的ETH交易明细怎么做呢 有两种方式 1 直接获取ETH最新块的交易明细 2 通过块获取用户的交易明细 废话不多说 直接贴代码看了 package com example demo web3jLog impor
  • pdf.js引入方式及初始化配置

    官方下载地址 Getting StartedA general purpose web standards based platform for parsing and rendering PDFs http mozilla github
  • actuator--基础--04--Springboot集成

    actuator 基础 04 Springboot集成 代码位置 https gitee com DanShenGuiZu learnDemo tree master actuator learn actuator01 1 代码 1 1 依
  • MongoDB游标

    数据库会使用游标返回 find 的执行结果 游标的客户端实现通常能够在很大程度上对查询的最终输出进行控制 你可以限制结果的数量 跳过一些结果 按任意方向的任意键组合对结果进行排序 以及执行许多其他功能强大的操作 要使用 shell 创建游标
  • 爬虫实战之华为应用市场

    目录 一 需求说明 二 步骤 1 检查当前页面的URL所获得的响应的数据 笨办法 程序验证 不建议 简单办法 抓包 验证 抓包 推荐 动态加载验证 查找页面的信息 2 获取排行页面数据 操作 源码 信息解析 3 详情页面分析 寻找URL 验
  • leetcode 577

    给定一个字符串 s 你需要反转字符串中每个单词的字符顺序 同时仍保留空格和单词的初始顺序 示例 1 输入 s Let s take LeetCode contest 输出 s teL ekat edoCteeL tsetnoc 示例 2 输
  • C++中的强引用与弱引用

    https juejin cn post 7102838307062546445 1 weak ptr的原理 weak ptr 是为了配合 shared ptr 而引入的一种智能指针 它指向一个由 shared ptr 管理的对象而不影响所
  • 神经网络中的激活函数

    一 激活的概念 将输入映射为特定分布的输出 完成非线性变换 多细胞生物神经元的树突接收信息 触发区整合电位 产生神经冲动 末端的突触向下一个神经元传递刺激 以人脑为例 人脑的细胞受刺激产生活动 而刺激的强度需要达到一定的阈值 没有达到阈值的
  • 基于51单片机数字频率计的设计与实现

    目录 第一章 系统原理与总体设计 1 1系统组成 1 2系统原理 1 3测量原理 1 4频率测量与总体设计 第二章 硬件电路设计 2 1硬件电路框图 2 2数字频率计原理图 2 3硬件电路设计 第三章 软件程序设计 3 1程序流程图 3 2
  • 魔方机器人之下位机编程------下位机完整程序

    头文件包含 include Includes h 总头文件 在此添加全局变量定义 uint8 msg 14 Hello World void PWM Init void PWM0 上侧旋转舵机 PWME PWME0 0x00 Disable
  • 查找恢复密钥

    登陆自己的微软账号可查看恢复密钥 点击以下链接查找恢复密钥 https account microsoft com devices recoverykey 根据密钥ID 输入对应的恢复密钥
  • win10蓝牙无法连接,可以尝试在此Windows设备上打开蓝牙

    win10蓝牙无法连接 可以尝试在此Windows设备上打开蓝牙 笔记本右下角蓝牙图标消失不见 操作步骤 1 首先在打开电脑中 按下 Win R 打开运行窗口输入 services msc 并进入 2 2 打开服务列表后 不断的向下翻 找到
  • 【华为OD机试真题】对称字符串(python)100%通过率 超详细代码注释 代码解读

    华为OD机试真题 2022 2023 真题目录 点这里 华为OD机试真题 信号发射和接收 试读 点这里 华为OD机试真题 租车骑绿道 试读 点这里 对称字符串 时间限制 1s空间限制 256MB限定语言 不限 题目描述 对称就是最大的美学
  • 最长公共上升子序列(LCIS)

    前置知识 LCS LIS 注意 刚开始看这个问题的时候 第一反应是先求出LCS再求出LCS的LIS 事实上这是有问题的 我们并不能保证这么求出的LCIS是最长的 比如下面这个例子 Example a 7 1 5 6 4 2 7 b 7 1
  • 【python + opencv + pytorch】车牌提取、分割、识别 pro版

    老规矩 先看最后成果图 如果想要全部工程 文章最后我会把github链接放上 1 分割车牌 2 分割字符 3 识别字符 最终识别的车牌号码是 浙F99999 整个车牌识别分五步 1 一个分割车牌的语义分割模型 2 用训练好DeepLab V
  • 复旦微单片机FM33LG系列之GPIO操作(FL库)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 引用文件 二 快速IO操作指南 1 GPIO位输出高电平 2 GPIO位输出低电平 3 GPIO位输出电平翻转 4 GPIO端口8位并口输出 5 GPIO端口1
  • 数据结构之快速排序算法

    文章目录 快速排序的思想 快速排序的递归实现 快速排序的非递归实现 快速排序的思想 设置两个变量i j 排序开始的时候 令i 0 j length 1 以第一个数组元素作为比较 赋值给temp 即temp nums 0 从j开始向前扫描 找