排序算法:归并排序、快速排序

排序算法:归并排序、快速排序

 

相关博客:

排序算法:冒泡排序、插入排序、选择排序、希尔排序

排序算法:归并排序、快速排序

排序算法:桶排序、计数排序、基数排序

排序算法:堆排序

十大排序算法小结


一、归并排序:

1、工作原理:

归并排序的采用分治思想,如果要排序一个数组,我们先把数组从中间分成前后两个部分,然后对前后两个部分分别进行排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。

2、动图演示:

排序算法:归并排序、快速排序

3、Java代码实现:

public class MergeSort {
	//归并排序:
	public void mergeSort(int[] a,int p,int r){
		//递归终止条件
		if(p>=r) return;
		
		int q=(p+r)/2;//取数组的中间点
		mergeSort(a,p,q);//对前半部分进行排序
		mergeSort(a,q+1,r);//对后半部分进行排序
		
		merge(a, p, q, r);//合并前后两个部分
	}
	
        //merge()函数是归并排序的重点
	public void merge(int[] a,int p,int q,int r){
		//初始化变量:i表示前半部分的下标,j表示后半部分的下标,k表示临时数组的下标
		int i=p;int j=q+1;int k=0;
		int[] tmp = new int[r-p+1];
		
		while(i<=q && j<=r){
			if(a[i]<=a[j]){
				tmp[k++]=a[i++];
			}else{
				tmp[k++]=a[j++];
			}
		}
		
		//将剩余数据拷贝到临时数组中
		for(;i<=q;i++) tmp[k++]=a[i];
		for(;j<=r;j++) tmp[k++]=a[j];
		
		//将tmp临时数组拷贝回原数组
		for(int x=0;x<r-p+1;x++) a[p+x]=tmp[x];
	}
}

4、算法分析:

(1)归并排序是一种稳定的排序算法;

(2)最好、最好、平均时间复杂度都是O(nlogn)。

(3)空间复杂度是O(n),所以不是原地排序。这也是归并排序的一个致命弱点。


二、快速排序:

1、工作原理:

快速排序也是利用分治思想。如果要排序一组数据,我们先选择这组数据中任意一个数据作为分区点pivot,然后遍历这组数据,将小于分区点pivot的放到左边,大于分区点pivot的放到右边,将pivot放到中间。然后再分别对左右两部分进行排序。

2、图片演示:

排序算法:归并排序、快速排序

3、Java代码实现:

public class QuickSort {

	public void quickSort(int[] a,int p,int r){
		//递归终止条件:
		if(p>=r) return;
		
		//获取分区点:
		int q=partition(a,p,r);
		quickSort(a,p,q-1);//对左分区进行排序
		quickSort(a,q+1,r);//对右分区进行排序
	}
	
	//返回分区点,快速排序的核心:
	public int partition(int[] a,int p,int r){
		
		int i=p;int pivot = a[r];
		for(int j=p;j<=r;j++){
			if(a[j]<pivot){
				swap(a,i,j);
				i++;
			}
		}
		swap(a, i, r);
		return i;
	}
	
	public void swap(int[] a,int x,int y){
		int temp=a[x];
		a[x]=a[y];
		a[y]=temp;
	}
}

其中,快速排序的核心就是paitition()分区函数,它的过程如下图所示:

排序算法:归并排序、快速排序

4、算法分析:

(1)快速排序是一种原地排序,空间复杂度为O(1)。

(2)快速排序是一种不稳定算法。

(3)快速排序是的最好时间复杂度、平均时间复杂度为O(nlogn)。但是在极端情况下,如果数组中的数据原来就是有序的,比如1,3,5,6,8,如果我们每次选择最后一个元素作为pivot,那每次分区得到的两个区间就是不均等的,我们需要大约进行n次分区操作,才能完成快排的整个过程,每次分区我们平均要扫描大约n/2个元素,这时时间复杂度为O(n^2),也就是最坏时间复杂度。


三、小结:归并与快排的区别:

(1)归并排序和快速排序都是用分治的思想,代码都是通过递归来实现的,但是归并排序的核心是merge()合并函数,而快速排序的核心是partition()分区函数。归并排序的处理过程是从下到上,先处理子问题,然后再合并。而快速排序的处理过程正好相反,它的处理过程是从上到下的,先分区,然后再处理子问题。这两种排序的处理过程如下图所示:

排序算法:归并排序、快速排序

(2)归并排序算法是一种任何情况下时间复杂度都比较稳定的排序算法,时间复杂度都是O(nlogn);快速排序算法最坏情况下时间复杂度为O(n^2),但是平均时间复杂度都是O(nlogn),不仅如此,快速排序时间复杂度退化到O(n^2)的概率非常小,我们可以通过合理选择pivot来避免这种情况。

(3)归并排序不是原地排序算法,空间复杂度比较高,为O(n);快速排序是原地排序算法,空间复杂度为O(1)。

(4)归并排序是稳定的算法,快速排序不稳定。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114619.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Oracle函数之LAG函数[通俗易懂]

    Oracle函数之LAG函数[通俗易懂]语法使用方法  LAG是一个分析函数。它可以在不使用自连接的情况下同时访问到一个表的多行数据。给一个或多个列名和一个游标位置(位移),LAG可以访问当前行之前的行,行之间间隔的行数为位移值。  语法树中的offset(位移)参数是可选的,可以指定一个大于0的整数,如果不指定offset(位移)参数函数会默认位移为1。语法树中的default值也是可选的,这个default值是当位移值超过查…

    2025年8月27日
    6
  • mysql fulltext搜索_mysql 全文搜索 FULLTEXT

    mysql fulltext搜索_mysql 全文搜索 FULLTEXT到3.23.23时,MySQL开始支持全文索引和搜索。全文索引在MySQL中是一个FULLTEXT类型索引。FULLTEXT索引用于MyISAM表,可以在CREATETABLE时或之后使用ALTERTABLE或CREATEINDEX在CHAR、VARCHAR或TEXT列上创建。对于大的数据库,将数据装载到一个没有FULLTEXT索引的表中,然后再使…

    2025年7月8日
    1
  • 360认证得力数据恢复软件,摄影爱好者的救星

    360认证得力数据恢复软件,摄影爱好者的救星  我是一位计算机工作者,身边许多朋友也经常向我咨询一些电脑方面的问题,最为突出的问题就是如何恢复硬盘数据和sd卡,U盘数据,我用过许多软件,但从没有一款软件像得力数据恢复软件这么优秀,这话一点都不假。  第一,无毒,众所周知,一款软件好坏,无毒是最大的招牌,它是经过360,金山毒霸,百度杀毒,卡巴斯基,电脑管家,诺顿杀毒等主流杀毒软件认证的。干净实用。  第二,下载方便,可以经过该地址:h…

    2022年8月20日
    7
  • visual studio code适合什么语言_将当前运行的配置备份成初始配置

    visual studio code适合什么语言_将当前运行的配置备份成初始配置VSCode是一款非常好用的编辑器(或者IDE),具有很好的可扩展性,功能比较强大,占用的系统资源也适中,启动速度较快,而且支持全平台,比较适合作为Python开发用的IDE。本文针对Linux(主要是Ubuntu,其他发行版类似),整合一些Python开发相关的配置,仅供刚入坑Linuxer参考。一、VSCode与其他编辑器(或IDE)的比较(1)VSCode与Atom的比较:Atom是一款由g…

    2022年8月25日
    6
  • RabbitMQ入门篇[通俗易懂]

    文章目录前言MQ的基本概念MQ的优势MQ的劣势常见的MQ产品RabbitMQRabbitMQ简介RabbitMQ中的相关概念:RabbitMQ工作模式Workqueues工作队列模式Pub/Sub订阅模式Routing路由模式Topics通配符模式工作模式总结消息确认生产者前言记录RabbitMQMQ的基本概念MQ全称MessageQueue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信MQ的优势应用解耦提高系统容错性和可维

    2022年4月8日
    57
  • 第 3.2 节 SQL

    第 3.2 节 SQL

    2021年3月12日
    131

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号