算法---分治策略(快排)

2023-10-27

分治策略之快速排序

快速排序是对冒泡排序算法的一种改进,快速排序在面试过程中被提到的概率还是很大的,本文章我将介绍一下有关快速排序的一些问题。

算法思想

(1)指定一个定界值,通过该值会将数组分成两部分
(2)将大于定界值的数据都放在右边,小于等于定界值的数据都放在左边,此时,以定界值为中心,左边全部都是小于等于定界值的数,右边全部都是大于定界值的数
(3)将左边的数据拿出来,又重新找一个定界值,重复上面的操作。右边的值也是相同的操作。
(4)可见,上面的操作是一个递归的过程,等左右两边的数据都进行完毕,即数组中的数据已经有序

在这里插入图片描述

eg:

矩形:定界值
线段:下一趟要进行快排的子序列
在这里插入图片描述

代码展示

递归方式

#include<stdio.h>
#include<assert.h>

int Parition(int* ar, int left, int right)
{
	int tmp = ar[left];
	while (left < right)
	{
		while (left < right && tmp < ar[right])
		{
			--right;
		}
		if(left < right)ar[left] = ar[right];
		while (left < right && ar[left] <= tmp)
		{
			++left;
		}
		if(left < right)ar[right] = ar[left];
	}
	ar[left] = tmp;
	return left;
}

void QuickPass(int* ar, int left, int right)//递归方式的快排
{
	if (left < right)
	{
		int  pos = Parition(ar, left, right);
		QuickPass(ar, left, pos - 1);
		QuickPass(ar, pos + 1, right);
	}
}

void QuickSort(int* ar, int n)
{
	assert(ar != NULL);
	QuickPass(ar, 0, n - 1);
}

非递归方式

#include<stdio.h>
#include<assert.h>
#include<stack>//c++中的栈
#include<queue>//c++中的队列

void NiceQuickSort_stack(int* ar, int n)//非递归用栈的方式
{
	assert(ar != NULL);
	stack<int> ist;
	ist.push(0);
	ist.push(n - 1);
	while (!ist.empty())
	{
		int right = ist.top(); ist.pop();
		int left = ist.top(); ist.pop();
		int pos = Parition(ar, left, right);
		if (left < pos - 1)
		{
			ist.push(left);
			ist.push(pos - 1);
		}
		if (pos + 1 < right)
		{
			ist.push(pos + 1);
			ist.push(right);
		}
	}
}

void NiceQuickSort_queue(int* ar, int n)//非递归用队列的方式
{
	assert(ar != NULL);
	queue<int> ist;
	ist.push(0);
	ist.push(n - 1);
	while (!ist.empty())
	{
		int left = ist.front(); ist.pop();
		int right = ist.front(); ist.pop();
		
		int pos = Parition(ar, left, right);
		if (left < pos - 1)
		{
			ist.push(left);
			ist.push(pos - 1);
		}
		if (pos + 1 < right)
		{
			ist.push(pos + 1);
			ist.push(right);
		}
	}
}

总结

快速排序的缺点:
1.越有序越慢,完全有序则为O(n^2);
2.空间复杂度为O(logn)不是O(1);3.不稳定;

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

算法---分治策略(快排) 的相关文章

随机推荐

  • iOS编程基础-OC(六)-专家级技巧:使用ARC

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 第6章 专家级技巧 使用ARC 本章是第一部分的最后一章 本章介绍ARC内存管理中的细微之处 如直接桥接对象使用ARC的方法 6 1 ARC和对象所有权 我们已经知道
  • 快排-java

    快排总结 分区方法 3个while 递归使用排序方法 使用了分治法 挖坑赋值法 package cn com import java util Arrays public class QuickSort public static void
  • 虚拟机上CentOS 7关闭防火墙操作

    虚拟机上CentOS 7关闭防火墙操作 1 首先查看防火墙的状态 使用的命令为 service iptables status 提示 Unit iptables service could not be found 解决方案 还原传统的管理
  • sprintf实例

    include
  • Unity热更新 ILRuntime 从零开始 HelloWorld(二)

    自从我凌晨两点放下喝醉的小姐姐回家写博客之后 小姐姐对我愈发的崇拜了 约我今晚一块学习ILRuntime 带好身份证 我这一想必须要未雨绸缪 安排 选了一个全市最好的网吧 斥巨资通宵5元 请小姐姐一块学习 一起记录下学习内容 这是这一系列文
  • 数字频率计设计

    FPGA教程目录 MATLAB教程目录 设计任务与要求 1 设计任务 设计并实现一个数字频率计 2 基本要求 测频率范围 10Hz 10K Hz 为保证测量精度分为三个频段 10Hz 100 Hz 100Hz 1K Hz 1 K Hz 10
  • lua语言json与table互转,简单方法

    使用方法 1 json转table luaJson json2lua tab 2 table转json luaJson table2json str 这个原理就是是逐个解析字符串 同样可以解析json xml 具体代码如下 这里解析json
  • wayland详解

    简单地说 Wayland是一套display server Wayland compositor 与client间的通信协议 而Weston是Wayland compositor的参考实现 其官网为http wayland freedesk
  • 如何制作网站?如何制作网站教程

    如果公司企业想要知道如何制作网站 那么需要了解一些相关的内容 本文将介绍如何制作网站教程 希望对大家有所帮助 首先我们做好一些准备 域名 建站工具 图文素材 营业执照等资质 步骤一 创建站点 进入建站工具 24 fkw com 后 在工具中
  • 前端Vue自定义精美商品分类组件category 可用于电商应用分类页面

    随着技术的发展 开发的复杂度也越来越高 传统开发方式将一个系统做成了整块应用 经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改 造成牵一发而动全身 通过组件化开发 可以有效实现单独开发 单独维护 而且他们之间可以
  • 贝叶斯分类

    贝叶斯分类 贝叶斯分类是一类分类算法的总称 这类算法均以贝叶斯定理为基础 故统称为贝叶斯分类 本文作为分类算法的第一篇 将首先介绍分类问题 对分类问题进行一个正式的定义 然后 介绍贝叶斯分类算法的基础 贝叶斯定理 最后 通过实例讨论贝叶斯分
  • [Cmake]源码编译安装Cmake

    源码编译安装Cmake 获取cmake软件包 解压并进入软件包目录 执行配置 编译和安装命令 设置环境变量 执行如下命令验证是否安装成功 获取cmake软件包 wget https cmake org files v3 18 cmake 3
  • PTA 7-3 求整数序列中出现次数最多的数 (10 分)

    本题要求统计一个整型序列中出现次数最多的整数及其出现次数 输入格式 输入在一行中给出序列中整数个数N 0
  • ELF文件头结构

    转自 https blog csdn net tangyuesb article details 54630787 ELF文件头结构定义在 usr include elf h 头文件下 ELF文件有32位版本和64位版本 故其头文件结构也有
  • 进度条教程【github.com/cheggaaa/pb】

    进度条 学习目标 学习内容 前置说明 一个简单的进度条案列 多个进度条的联合使用 进度条在文件Copy IO流的运行 学习总结 学习目标 了解进度条运行原理 掌握github com cheggaaa pb第三方依赖的函数 实践一个进度条
  • 【基础知识】什么是哈希冲突?

    1 什么是哈希表 哈希表 Hash Table 是一种数据结构 它可以快速地在大量数据中查找 插入和删除时数据 哈希表通过使用哈希函数将键 Key 映射到一个位置 然后在该位置存储或查找数据 哈希函数的作用是 将键转换为一个整数 这个整数通
  • linux下服务get请求发生400的问题

    今天遇到个郁闷的问题 平时在windows系统一直跑得好好的服务 在linux下图片请求出问题了 报了个莫名其妙的400问题 虽然我也怀疑问题出在params 22cols 22 22 22id 22 6 22 参数上 但把引号怎么改都改不
  • 【笔记】QString中替换掉指定字符串

    首先使用正则表达式QRegExp匹配指定字符串 然后使用QString的replace方法进行替换 QString originText KobeBryantGigiAitch QString searchText Bryant QStri
  • ubuntu下samba 安装与配置

    为了实现在windows与Linux之间资源共享 Linux操作系统提供了samba服务 samba服务为两种不同的操作系统架起一座桥梁 使Linux系统和windows系统之间可以互相通信 下面简单介绍如何在linux上添加和配置samb
  • 算法---分治策略(快排)

    分治策略之快速排序 快速排序是对冒泡排序算法的一种改进 快速排序在面试过程中被提到的概率还是很大的 本文章我将介绍一下有关快速排序的一些问题 算法思想 1 指定一个定界值 通过该值会将数组分成两部分 2 将大于定界值的数据都放在右边 小于等