快速排序基本思想及代码实现-史上最通俗易懂的

2023-11-03

来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=1236

1、算法思想
     快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
(1) 分治法的基本思想
     分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

(2)快速排序的基本思想
     设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:
①分解: 
     在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。
  注意:
     划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表示为(注意pivot=R[pivotpos]):
     R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys
                  其中low≤pivotpos≤high。
②求解: 
     通过递归调用快速排序对左、右子区间R[low..pivotpos-1]和R[pivotpos+1..high]快速排序。

③组合: 
     因为当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,"组合"步骤无须做什么,可看作是空操作。

2、快速排序算法QuickSort
  void QuickSort(SeqList R,int low,int high)
   { //对R[low..high]快速排序
     int pivotpos; //划分后的基准记录的位置
     if(low<high){//仅当区间长度大于1时才须排序
        pivotpos=Partition(R,low,high); //对R[low..high]做划分
        QuickSort(R,low,pivotpos-1); //对左区间递归排序
        QuickSort(R,pivotpos+1,high); //对右区间递归排序
      }
    } //QuickSort

image.png

image.png

#include <stdio.h>
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left, int right) {
	int i, j, t, temp;
	if(left > right)
		return;
    temp = a[left]; //temp中存的就是基准数
    i = left;
    j = right;
    while(i != j) { //顺序很重要,要先从右边开始找
    	while(a[j] >= temp && i < j)
    		j--;
    	while(a[i] <= temp && i < j)//再找右边的
    		i++;       
    	if(i < j)//交换两个数在数组中的位置
    	{
    		t = a[i];
    		a[i] = a[j];
    		a[j] = t;
    	}
    }
    //最终将基准数归位
    a[left] = a[i];
    a[i] = temp;
    quicksort(left, i-1);//继续处理左边的,这里是一个递归的过程
    quicksort(i+1, right);//继续处理右边的 ,这里是一个递归的过程
}
int main() {
	int i;
    //读入数据
	scanf("%d", &n);
	for(i = 1; i <= n; i++)
		scanf("%d", &a[i]);
    quicksort(1, n); //快速排序调用
    //输出排序后的结果
    for(i = 1; i < n; i++)
    	printf("%d ", a[i]);
    printf("%d\n", a[n]);
    return 0;
}

我在这里发明了一种简单的,通俗易懂的快速排序方法,代码如下:

#include <stdio.h>

void swap(int a[],int i,int j)
{
	int t;
	t=a[i];
	a[i]=a[j];
	a[j]=t;
}

void quickSort(int a[],int left,int right)
{
	int mid,i,j;

	if(left>=right)
		return;

	mid = a[left];
	i=left;
	j=left+1;
	while(j<=right)
	{
		if(a[j]<=mid)
		{
			i++;
			swap(a,i,j);
		}
		j++;
	}
	swap(a,i,left);
	quickSort(a,left,i-1);
	quickSort(a,i+1,right);
}

int main()
{
	int a[9]={8,2,6,12,1,9,5,5,10};
	int i;
	quickSort(a,0,8);/*排好序的结果*/
	for(i=0;i<9;i++)
	printf("%d\n",a[i]);
	return 0;
}

核心代码在这里:

image.png

观察上面代码可知,j一直在向后移,而i只有在发生交换操作后才后移。可见,小于等于i坐标的数值都是小于等于mid值的,大于i坐标的数值都是大于mid值的。

i是先加1再交换的。

简单吧,通俗易懂吧,哈哈,希望对大家有帮助!

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

快速排序基本思想及代码实现-史上最通俗易懂的 的相关文章

  • MyISAM 和 InnoDB 的区别

    对比项 MyISAM InnoDB 主外键 不支持 支持 事务 不支持 支持 锁 表锁 操作一条记录也会锁住整个表 不适合高并发 行锁 操作只锁一行 不影响其他行 适合高并发 缓存 只缓存索引 不缓存数据 缓存索引和数据 对内存要求高 表空
  • 个人小程序借助免费插件实现智能语音问答功能

    目标 个人小程序实现智能语音问答功能 实现 小程序免费插件chatbot 微信智能开发平台 微信同声传译插件 免费 借助tenserflow js的小程序插件 tenserflow免费训练库 代办 示例 智能对话小程序
  • angular:富文本编辑器推荐ngx-quill

    npm网址ngx quill npm 官方网址Quill Your powerful rich text editor 使用 npm install ngx quill npm i save dev types quill 1 3 10 2
  • Qt导入ui文件的方法

    1 首先对项目Test 0右键点击 添加现有文件 选择要添加的新的Design 5 ui文件 导入新的ui文件 2 打开Test 0 pro文件 会有以下形式的代码 确保其中有导入的ui文件Design 5 ui FORMS a ui b
  • Spring ioc容器创建过程(1)BeanFactory初始化

    文章目录 一 ApplicationContext 二 常见的ApplicationContext 三 ioc容器的初始化 1 AbstractApplicationContext prepareRefresh 2 AbstractAppl
  • PYTHON学习:numpy初探

    1 size itemsize size 矩阵元素数目 itemsize 矩阵每个元素的字节数 2 non zero 返回非0元素的索引 3 mean 返回矩阵所有元素的平均值 4 nan np nan值np中的空值 空值和isNone不是
  • DOS命令(windows)

    DOS命令 windows 目录 1 打开命令提示符 2 切换至根 3 当前路径 4 切换至上级路径 5 查看当前目录 6 查看文件内容 7 删除文件 8 进入长文件夹名时缩写 9 复制文件 10 移动文件 1 打开命令提示符 命令 win
  • 【opencv】Python-OpenCV自学自用笔记-上篇

    前言 本文是我在学习opencv时记录的笔记 内容较为简洁 会记录从入门到做项目这段时间的内容 最终目的是完成我的毕业设计 欢迎大家给予批评指正 本篇为第一本书 Python OpenCV从入门到精通 的笔记 前两章为安装 略过 第六章到第
  • 基于Jekyll创建免费的静态博客站点

    完整版请参考 https mazhaoxin github io 2018 08 04 Create Free Static Blog Base On Jekyll http 483v7j coding pages com 2018 08
  • JavaScript & ES6 部分面试题汇总

    1 js数据类型有哪些 基本类型 字符串 String 数字 Number 布尔 Boolean 空 Null 未定义 Undefined Symbol 唯一值 引用类型 对象 Object 数组 Array 函数 Function Set
  • 在Form窗体中,this的应用

    背景 在BHHT Bill界面中点击某个按钮时 弹出BHZX界面 并在BHZX界面中输入值 然后将BHZX界面中输入的值传递回BHHT Bill界面 在BHHT Bill界面中 属性 public string vsBZ string Em
  • Seaborn的使用以及调色板的设置

    Seaborn的使用以及调色板的设置 1 Seaborn简介 Seaborn是基于Python并且非常受欢迎的图形可视化库 并且在matplotlib的基础上进行了更高级的封装 使用作图更加方便快捷 可以通过极简的代码做出十分具有价值并且非
  • 【网络安全带你练爬虫-100练】第23练:文件内容的删除+写入

    目录 0x00 前言 0x02 解决 0x00 前言 本篇博文可能会有一点点的超级呆 0x02 解决 你是不是也会想 使用pyrhon将指定文件夹位置里面的1 txt中数据全部删除以后 gt 然后再将参数req text的值写入到1 txt
  • 前端小白HTML——1.html基础

    HTML语言的基本规则 1 1 HTML基本结构 内是头部信息 不显示在网页上 内是网页内容

随机推荐

  • vs2019断点调试设置断点条件

    系列文章目录 文章目录 系列文章目录 前言 一 使用条件断点 二 使用步骤 1 示例代码 前言 使用vs2019调试代码时 如果遇到for while do while逊汗语句时 而且循环次数很多时 改怎么办呢 一 使用条件断点 二 使用步
  • Ubuntu18.04使用阿里源镜像安装Docker并配置镜像加速【图文详细】

    官方安装文档 https docs docker com engine install ubuntu 阿里源安装文档 推荐 https developer aliyun com mirror docker ce spm a2c6h 1365
  • Unable to build Cython components. Please make sure Cython is installed if the torch.hub

    在我使用torch hub的时候报了如下一个错误 解决方法 参考 https github com h5py h5py issues 535 先安装 h5py 再安装 Cython pip install h5py pip install
  • 概率论中高斯分布(正态分布)介绍及C++11中std::normal_distribution的使用

    高斯分布 最常用的分布是正态分布 normal distribution 也称为高斯分布 Gaussian distribution 正态分布N x 2 呈现经典的 钟形曲线 的形状 其中中心峰的x坐标由 给出 峰的宽度受 控制 正态分布由
  • c++ 提取字符串前面数字stoi和atoi

    stoi和atoi 包含在 include lt cstdlib gt 作用是将字符串转化为int型 区别是stoi的形参是string 而atoi的形参是char 注 只是将字符串前面是数字的部分提取出来 代码可以看这篇文章 https
  • ChatGPT无限卡Cloudflare 验证你是真人

    问题 我的情况是这样 在Chrome里 打开chatGPT的网页 会无限验证你是真人 打开无痕浏览页面可以正常登录 2023 04 20 更新 新的解决方案 github上有一个油猴脚本 KeepChatGPT 可以解决这个问题 至少目前我
  • 02Tcpdump命令详解-网络抓包工具

    1 概述 今天我们要介绍的是一款网络抓包工具tcpdump 重点讨论并介绍一些有用的命令及最佳实践 tcpdump是一个功能最强大 应用最广泛的命令行数据包嗅探器或包分析工具 用于抓取或过滤制定接口接受或发送的TCP IP数据包 tcmpd
  • 42-Docker-Docker命令详解-docker build

    Docker命令详解 docker build 前言 docker build 原理 语法格式 options说明 使用示例 前言 本篇来学习下制作docker镜像的命令 docker build docker build 原理 docke
  • 环境文件复制

    1 yaml复制 package com ybw yaml demo generate import com alibaba fastjson2 JSON import lombok extern slf4j Slf4j import or
  • linux android studio 快捷方式,Android Studio 使用小技巧和快捷键

    Android Studio 使用小技巧和快捷键 Published by xiaosixi on 2016年12月19日 1 书签 Bookmarks 描述 这是一个很有用的功能 让你可以在某处做个标记 书签 方便后面再跳转到此处 调用
  • 【论文速览】ICLR23 - 将图像视为一组点集 Image as Set of Points

    文章目录 研究背景 解决思路 部分实验效果 思考 参考资料 收录于ICLR2023 oral notable top 5 代码地址 https github com ma xu Context Cluster 研究背景 目前计算机视觉领域最
  • 循环代码模型构建方法

    循环结构是源代码程序的重要结构 然而即使是简单的循环程序 也很容易出错 循环中的很多错误往往需要执行多次或者在某些特定的情况下才能被发现 检测这些错误的代价很高 所以需要重点开展对软件循环代码的安全性分析研究 而对循环代码结构进行研究的重要
  • 2018年Android面试题含答案--适合中高级

    1 java中 和equals和hashCode的区别 基本数据类型的 比较的值相等 类的 比较的内存的地址 即是否是同一个对象 在不覆盖equals的情况下 同比较内存地址 原实现也为 如String等重写了equals方法 hashCo
  • 如何学会读论文?送你滑铁卢大学S. Keshav的三轮阅读法

    来源 专知 本文约3100字 建议阅读6分钟 本文为你介绍三轮阅读法 教你如何高效读论文 导读 读论文是从事科学研究与工程等必不可少环节 但是如何高效读论文却有一番讲究 滑铁卢大学S Keshav 撰写了 How to Read a Pap
  • 80 后女程序员拒当「码农」:“转行小说家后,我用 AI 写了 16 本书!”

    省时查报告 专业 及时 全面的行研报告库 省时查方案 专业 及时 全面的营销策划方案库 免费下载 2023年8月份全网热门报告合集 ChatGPT提词示例 让你的ChatGPT聪明100倍 超百页干货资料 AI应用的难点 痛点与未来 202
  • 终止关闭服务端口号 8080为例

    Identify and stop the process that s listening on port 8080 or configure thi 当我们遇到服务器端口号被占用的时候 下一个服务器就带不开了 让人很是烦躁 下面猿猿总结
  • 【华为OD机试真题 python】事件推送【2022 Q4

    题目描述 事件推送 同一个数轴X上有两个点的集合A A1 A2 Am 和B B1 B2 Bn Ai和Bj均为正整数 A B已经按照从小到大排好序 A B均不为空 给定一个距离R 正整数 列出同时满足如下条件的所有 Ai Bj 数对 1 Ai
  • oracle单实例客户端连接的failover功能

    今天测试了一下单实例数据库客户端连接的failover功能 操作系统为red hat 5 5 root localhost cat etc issue Red Hat Enterprise Linux Server release 5 5
  • vue项目树状图的实现

    1 实现背景 项目需要直观的展示元素之间的关系 需要实现一个树状图 数据可视化可以用Echarts HighCharts 但是相关树状图的示例不够直观 且不美观 几种工具之间比较 选择了蚂蚁金服的G6来实现 在开发期间有树状图的示例 之后再
  • 快速排序基本思想及代码实现-史上最通俗易懂的

    来源 我是码农 转载请保留出处和链接 本文链接 http www 54manong com id 1236 1 算法思想 快速排序是C R A Hoare于1962年提出的一种划分交换排序 它采用了一种分治的策略 通常称其为分治法 Divi