十大经典排序算法:快速排序和归并排序

【数据结构】-快速排序的四种方法实现以及优化 关于快排的四种写法,以及优化版本 阅读详情

快速排序

快速排序:说白就是找一个基准的值,使得左边的值都小于基准值,右边的值都大于基准值,然后可以分别对左边和右边的按照上面的步骤再排序,当左右两边都排好序之后,整个数组也就完成排序了。

排序流程

快速排序算法通过多次比较和交换来实现排序,其排序流程如下:

  • 首先设定一个分界值,通过该分界值将数组分成左右两部分。
  • 将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
  • 然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
  • 重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

排序步骤

原理

  • 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选
    用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

一趟快速排序的算法是:

  • 设置两个变量i、j,排序开始的时候:i=0,j=N-1;
  • 以第一个数组元素作为关键数据,赋值给key,即key=A[0];
  • 从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]的值交换;
  • 从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换;
  • 重复第3、4步,直到i==j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

排序演示

  • 假设一开始序列{xi}是:5,3,7,6,4,1,0,2,9,10,8。
  • 此时,ref=5,i=1,j=11,从后往前找,第一个比5小的数是x8=2,因此序列为:2,3,7,6,4,1,0,5,9,10,8。
  • 此时i=1,j=8,从前往后找,第一个比5大的数是x3=7,因此序列为:2,3,5,6,4,1,0,7,9,10,8。
  • 此时,i=3,j=8,从第8位往前找,第一个比5小的数是x7=0,因此:2,3,0,6,4,1,5,7,9,10,8。
  • 此时,i=3,j=7,从第3位往后找,第一个比5大的数是x4=6,因此:2,3,0,5,4,1,6,7,9,10,8。
  • 此时,i=4,j=7,从第7位往前找,第一个比5小的数是x6=1,因此:2,3,0,1,4,5,6,7,9,10,8。
  • 此时,i=4,j=6,从第4位往后找,直到第6位才有比5大的数,这时,i=j=6,ref成为一条分界线,它之前的数都比它小,之后的数都比它大,对于前后两部分数,可以采用同样的方法来排序。

框架

void sort(int[] nums, int lo, int hi) {
    /****** 前序遍历位置 ******/
    // 通过交换元素构建分界点 p
    int p = partition(nums, lo, hi);
    /************************/

    sort(nums, lo, p - 1);
    sort(nums, p + 1, hi);
}

完整代码示例

package package2021_11;

public class Demo2 {
	public static void main(String[] args) {
		int[] values= {5,3,7,6,4,1,0,2,9,10,8};
		qsort(values,0,values.length-1);
		for (int i : values) {
			System.out.print(i+" ");
		}
		
	}

	public static void qsort(int[] values,int left,int right) {
		if(right<=left)
			return;
//		System.out.println(left+"---"+right);
		
		int i=left;
		int j=right;//固定左右端点
		int key=values[left];
		int flag=-1;//right动
		
		while(left!=right) {
			if(flag==-1) {
				// 满足条件
				if(values[right]<key) {
					values[left]=values[right];
					flag=0;//left动
					continue;
				}else {
					right--;
				}
			}
			if(flag==0) {
				if(values[left]>=key) {
					values[right]=values[left];
					flag=-1;
					continue;
				}else {
					left++;
				}
			}
		}
		values[left]=key;
		
		qsort(values,i,left-1);
		qsort(values,left+1,j);
	}
}

归并排序

归并排序:是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

在这里插入图片描述

分

其实分的过程不难理解,就是一个递归拆分子序列的过程

治(合)

两个子序列合并成一个有序序列比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。
在这里插入图片描述

代码框架

// 定义:排序 nums[lo..hi]
void sort(int[] nums, int lo, int hi) {
    int mid = (lo + hi) / 2;
    // 排序 nums[lo..mid]
    sort(nums, lo, mid);
    // 排序 nums[mid+1..hi]
    sort(nums, mid + 1, hi);

    /****** 后序位置 ******/
    // 合并 nums[lo..mid] 和 nums[mid+1..hi]
    merge(nums, lo, mid, hi);
    /*********************/
}

完整代码示例

package package2021_11;

public class Demo {
	public static void main(String[] args) {
		int[] values= {18,11,0,19,101,1};
		int[] res=wsort(values,0,values.length-1);
		for (int i : res) {
			System.out.print(i+" ");
		}
	}
	public static int[] wsort(int[] values,int left,int right) {
		if(right==left)
			return new int[]{values[left]};
		
		int mid=(right-left)/2;
		
		int[] leftvalues=wsort(values,left,left+mid);
		int[] rightvalues=wsort(values,left+mid+1,right);
		
		return merge(leftvalues,rightvalues);
	}
	
	public static int[] merge(int[] leftvalues,int[] rightvalues) {
		int[] temp=new int[leftvalues.length+rightvalues.length];
		int i=0;
		int j=0;
		int index=0;
		while(i!=leftvalues.length||j!=rightvalues.length) {
			
			if(i==leftvalues.length&&j!=rightvalues.length) {
				for (int k = j; k < rightvalues.length; k++) {
					temp[index]=rightvalues[k];
					index++;
				}
				break;
			}
			if(i!=leftvalues.length&&j==rightvalues.length) {
				for (int k = i; k <leftvalues.length; k++) {
					temp[index]=leftvalues[k];
					index++;
				}
				break;
			}
			
			
			if(i<leftvalues.length&&leftvalues[i]<=rightvalues[j]) {
				temp[index]=leftvalues[i];
				i++;
				index++;
				continue;
			}
			if(j<rightvalues.length&&leftvalues[i]>rightvalues[j]) {
				temp[index]=rightvalues[j];
				j++;
				index++;
				continue;
			}
			
			
		}
		
		return temp;
		
	}
}

十大经典排序算法总结(C++实现+动画) 【C++】一文让你彻底学会排序算法(含精美动图) 阅读详情

相关推荐

十大经典排序算法

性能对比随机生成区间0 ~ K之间的序列,共计N个数字,利用各种算法进行排序,记录排序所需时间。

Mr.xing的博客 3516

【数据结构】快速排序详解

超级详细的快速排序,看完即可手撕快排!

weixin_69519040的博客 7887

Algorithm:【算法进阶之路】之算法面试刷题集合—十大经典排序算法(​简单插入排序/希尔排序、选择排序/堆排序、冒泡排序/快速排序、归并排序、计数排序/桶排序/基数排序)动态图文讲解及其代码实现

​ Algorithm:【算法进阶之路】之算法面试刷题集合—十大经典排序算法(​简单插入排序/希尔排序、选择排序/堆排序、冒泡排序/快速排序、归并排序、计数排序/桶排序/基数排序)动态图文讲解及其代码实现 目录 相关文章 排序算法思维导图 十大算法复杂度、稳定性比较 十大排序算法 相关文章 DSt:数据结构的简介、最强学习路线(逻辑结构【数组-链表-栈和队列/树-图-哈希】、物理结构【元素/关系】、数据运算【十大排序/四大查找-图三大搜索-树三大遍历】

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 4万+

数据结构-快速排序

快速排序的基本思想是分治法,在待排序元素中任取一个元素作为基准,通过一定的操作使得一边的元素都小于该基准值,而另一边的元素都大于该基准值。通过这一趟排序划分被选为基准值的元素放在了最终正确的位置。然后对该基准值的左右两边元素分别递归地重复上述过程,直到左右两边的区间只有一个元素或者区间不存在,也就是待排序的所有元素都放在了其最终位置上。

m0_61433144的博客 2817

rightvaluestest.github.io:Rightvalues 是针对光谱右侧人群的测验,基于 LeftValues 测验,旨在确定您在右翼光谱中的位置,作为 LeftValues 的替代方案。 如果你不是右派,这个测验显然不适合你,你应该寻找LeftValues。 您将看到一个陈述,然后您将回答您对该陈述的看法,从非常同意到非常不同意,每个答案都会略微影响您的分数。 在测验结束时,您的答案将与每个值的最大可能值进行比较,从而为您提供一个百分比

正确的价值观测试 Rightvalues 是针对光谱右侧人群的测验,基于 LeftValues 测验,旨在确定您在右翼光谱中的位置,作为 LeftValues 的替代方案。 如果你不是右派,这个测验显然不适合你,你应该寻找LeftValues。 您将看到一个陈述,然后您将回答您对该陈述的看法,从非常同意到非常不同意,每个答案都会略微影响您的分数。 在测验结束时,您的答案将与每个值的最大可能值进行比较,从而为您提供一个百分比。 此测验由 Github 用户“rightvaluestest”制作。

rightvalues-old:Rightvalues 是针对光谱右侧人群的测验,基于 LeftValues 测验,旨在确定您在右翼光谱中的位置,作为 LeftValues 的替代方案。 如果你不是右派,这个测验显然不适合你,你应该寻找LeftValues。 您将看到一个陈述,然后您将回答您对该陈述的看法,从非常同意到非常不同意,每个答案都会略微影响您的分数。 在测验结束时,您的答案将与每个值的最大可能值进行比较,从而为您提供一个百分比

正确的价值观测试 Rightvalues 是针对光谱右侧人群的测验,基于 LeftValues 测验,旨在确定您在右翼光谱中的位置,作为 LeftValues 的替代方案。 如果你不是右派,这个测验显然不适合你,你应该寻找LeftValues。 您将看到一个陈述,然后您将回答您对该陈述的看法,从非常同意到非常不同意,每个答案都会略微影响您的分数。 在测验结束时,您的答案将与每个值的最大可能值进行比较,从而为您提供一个百分比。 此测验由 Github 用户“rightvaluestest”制作。 旧版! 这是一个旧版本的测试。 测试的 Github 已移至 。

十大经典排序算法:归并排序 & 快速排序

知识回顾:排序算法分类 排序算法通常可以分成两大类: 比较类排序:通过比较来决定元素的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 知识回顾:排序算法复杂度 归并排序(MergeSort) ...

lsz137105的专栏 767

演化计算(蚁群算法、粒子群算法、遗传算法、演化规则......)

演化算法1.概念2.解决的问题 1.概念 传统算法(如梯度下降法、爬山法)根据导数的性质决定迭代的方向;而演化计算是一组解在一起协同作用产生一个最优解。 2.解决的问题 预测优化:演化计算(蚁群算法、粒子群算法、遗传算法等) 解的聚散、多样性:通过多次聚散,尽快得出最优解(某个解不合要求,要能够发散出去) ...

dear_jing的博客 4165

【数据结构与算法】十大经典排序算法深度解析:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、桶排序、基数排序

在本文中,我们将逐一介绍每种排序算法的基本原理、实现步骤、性能特点以及适用场景。通过具体的代码示例和性能比较,读者将能够深入理解每种算法的优势与局限,从而在实际应用中做出更加合理的选择。

倔强的石头的博客 9650

Comsol 基于局部谐振压电材料的可调水下低频吸声

它通过建立基于LRPM的水下吸声理论模型,从有效材料的角度分析可调吸声特性和吸声机理,进一步提高吸声性能。该研究发现,薄的LRPM层可以在目标低频范围内实现出色的吸声效果,而这个目标低频可以通过操纵谐振分流电路进行主动调谐。通过引入局部谐振压电超材料和可调谐的谐振分流电路,研究人员能够有效地控制水下低频吸声特性,并且在吸声带宽方面取得了显著的改进。通过利用薄的活性超材料层,LRPM在水声吸声方面展现出潜力,并且通过操纵谐振分流电路,可以实现对吸声特性的精细控制。

weixin_45382232的博客 786

【03】海康MVS V4.3.0 ——安装教程、查看示例、库、头文件、开发指南

海康威视MVS机器视觉软件安装与使用指南:首先从官网下载MVS 4.3.0安装包,默认设置完成安装。安装后可在Development目录查看示例代码、开发文档及头文件,支持C++/C#/Python等多语言开发。软件内置虚拟相机功能,通过工具菜单添加虚拟设备后即可模拟真实相机操作,支持中英文界面切换、参数调节(曝光/增益等)及图像采集功能。虚拟相机虽仅能显示预设图像,但完整保留了参数调节功能,适合开发者进行功能测试。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 3317

十大经典排序算法详解

本文转自 《卢明冬的博客》 相关的同学可以关注一下 文章目录排序算法的分析和评价2.十大排序经典算法总览2.1 排序算法的分类 排序算法是《数据结构和算法》中非常基础的算法,但却占据着十分重要的位置,几乎可以说是我们在日常编程代码中使用最频繁的基础算法。本文对常见的十大经典排序算法进行了详细的知识点梳理,从排序思路、动图演示、代码实现、复杂度分析、算法优化等多个方面分别对不同的排序算法进行讲解,内容详实,一篇文章几乎囊括了排序算法所有必知必会的知识点,夸张点说,算得上是 “史上最全” 排序算法讲解。

yunweigo的博客 4101

我用 AI Agent 全自动跑 COMSOL 仿真:从建模到后处理,踩了 10+ 个深坑

本文探讨了利用AI通过COMSOL Java API实现AI芯片液冷冷板全流程自动化仿真的实践。针对700W高功耗AI芯片的散热需求,构建了包含4颗Chiplet和微通道冷板的三维液冷模型。通过严格设计的Prompt工程,AI Agent成功完成了从几何建模到结果验证的全过程,最终实现了芯片最高温度54°C的良好散热效果。文章重点分享了10个关键问题的解决经验,包括流体连通性验证、网格顺序控制、离散阶数选择、收敛判据优化等,并建立了包含流场/热场/网格独立性的三重验证体系。实践表明,AI可高效处理重复性工作

sjjsjjsjjsjjsjj的博客 995

经典十大排序算法【Java版完整代码】

虽然已经有很多人总结过这十大排序算法,优秀的文章也不少,但是Java完整版的好像不多,还存在某些文章代码存在错误的情况,同时也为了自己练手,决定把所有的写一遍巩固下,同时也真诚的希望阅读到这篇文章的小伙伴们可以自己去从头敲一遍,不要粘贴复制!希望我的文章对你有所帮助,每天进步一点点!!!我用通俗的理解写下对算法的解释,对某个算法的运行过程不是很理解的话或者想看比较官方的解释的话,单独搜索某个算法,看几篇不同的解释,就可以有自己的理解了,这里我主要展示代码以及进行通俗的解释!

weixin_42487883的博客 843

Agent驱动电商运营:从选品到售后的全链路革新

在当今竞争激烈的电商市场中,传统的电商运营模式面临着诸多挑战。从选品到售后,每个环节都需要大量的人力投入和专业知识。选品需要深入了解市场趋势和消费者需求,营销需要精准定位目标用户,客服需要24小时响应用户咨询。这些工作不仅耗时耗力,而且容易受到人为因素的影响,导致效率低下和成本高企。AI Agent是一种能够感知环境、做出决策并采取行动的智能系统。感知能力:能够获取和处理环境信息。决策能力:能够根据感知到的信息做出决策。行动能力:能够执行决策,对环境产生影响。学习能力。

AI 领航者的博客 356

构建企业级AI税务顾问:优化税收策略与合规

本文深入探讨了构建企业级AI税务顾问的重要性及其在实际应用中的价值。通过分析当前税务领域的挑战和问题,本文详细介绍了AI税务顾问的基本原理、技术架构、核心功能以及实践应用。文章以逐步分析的方式,从背景介绍、核心概念与联系、算法原理讲解、系统分析与架构设计、项目实战到最佳实践与展望,系统性地展示了如何利用AI技术优化税收策略并确保税务合规。文章旨在为企业和税务从业者提供实用的指导,推动AI在税务领域的创新与发展。在当前全球经济一体化的背景下,企业面临着越来越复杂的税务环境。首先,税收法规的复杂性日益增加。

AI天才研究院 1157

十大排序算法java实现

因为面试美团的时候,面试官让我写个快排我20分钟都没写出来,后面经高人指点,把十大经典排序算法抄十遍,因此有了这篇博客的出现。 1. 冒泡排序 // 冒泡排序算法平均n2,最好n,最坏n2,空间复杂度1,稳定 class Solution { public int[] buubleSort(int[] nums) { if (nums == null || nums.len...

wl1929的博客 136

【Python机器学习】零基础掌握RFECV特征选择

通过应用算法,有效地识别了影响购买意愿的关键特征(浏览时长和点击数)和历史货币流通的主要因素(年代、人口和货币流通量)。这样的特征选择不仅提高了模型的解释能力,还可能用于电商推荐系统和历史研究的优化。优点总结,这种方法可以高效地找出对目标变量有最大影响的特征,进而可以用于各种实际应用场景,如电商推荐和历史研究。优点名称对应描述说明高解释性易于理解哪些特征最为重要泛化性能强通过交叉验证提高模型的稳健性应用场景多样可用于电商、金融、历史研究等多个领域。

Mr数据杨 1999

十大排序算法的实现(C/C++)

已在之前的回答中给出。

92377 534

【XCharts插件】3-1、制作图表及代码生成图表(v1.0)

XCharts插件是一款基于UGUI的功能强大、易用、参数可配置的数据可视化图表插件。【Unity3D插件】XCharts插件完全教程《全网最全》-专栏文章目录OK,这是v1.0版本的XCharts插件的创建图表,代码生成图表的教程。可能有人要问了,既然都更新到v3.0了,还写啥v1.0教程呢。因为有些项目就是用v1.0去制作图表了,也没有太多的精力去更新插件,所以就一直用的v1.0,而且v1.0已经能实现大部分的图标样式了,所以,博主还是单独写了一篇文章来介绍v1.0的功能。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1295

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

python 排序_用Python手写十大经典排序算法

作者 | hustcc排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:关于时间复杂度:平方阶 (O(n2)) 排序 各类简单排序...

weixin_39621060的博客 95

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java实现十大排序算法---优化版

十大排序算法优化后-java实现=—带注释 package com.test.autimatic; import java.util.Arrays; /** * @author 25338 * @version 1.0 * @date 2021/11/22 19:09 * @description */ public class Sort { public static void main(String[] args) { int[] arr = {21,3,4,2,1

weixin_43795840的博客 447

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

中希尔排序例题代码_用Python手写十大经典排序算法

作者 | hustcc排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:关于时间复杂度:平方阶 (O(n2)) 排序 各类简单排序...

weixin_39679370的博客 95

C++、Python实现十大经典排序算法

一、算法概述 1. 算法 算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。 2. 算法的特性 算法具有五个特性:有穷性、确定性、可行性、输入和输出。 3. 算法的设计目标 算法的设计目标是:正确性、可使用性、可读性、健壮性和算法效率。 其中算法效率通过算法时间复杂度和空间复杂度来描述。 高效率与低存储量需求:通过算法的效率主要指算法的执行时间,对于同一个问题,如果有多种算法可以求解。执行时间短的算法效率高。宋草存储量指的是算法执行过程中所需的最大存储空间,算法效率和

qq_44723773的博客 680

我眼中用lua语言实现十大经典算法

目录一、冒泡排序二、选择排序三、插入排序四、希尔排序五、归并排序六、快速排序七、堆排序八、桶排序九、计数排序十、基数排序 一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、归并排序 六、快速排序 七、堆排序 八、桶排序 九、计数排序 十、基数排序 ...

在Redhat7.2环境下用C语言写小游戏 276
上一篇: 二叉树刷题学习笔记1——框架
下一篇: 二叉树刷题学习笔记2
@@老胡
博客等级 码龄7年 291粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值