归并排序(递归)- 数据结构与算法

硅谷探秘者 1212 0 0
算法思想

该算法使用递归法实现,思路为:每次递归将待排序数组在中间位置分成左右两组,分别对左右两个数组进行归并排序,递归的条件是数组长度必须大于等于3,所以当数组中只有两个数据的时候可以直接进行比较排序,若数组只有一个元素则无需操作。每次递归结束时,左右两个数组都是有序的,然后对这两个中的数据进行排序,使整个数组有序。直到算法结束。

public class Test8{
	
	public static int a[]=new int[]{13,12,11,10,9,8,7,46,5,4,3,2,1,58,56,45,12};
	
	public static void main(String args[]){
		rec(0,a.length-1);
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+" ");
		}
	}
	
	public static void rec(int left,int right){
		if(left+1==right){
			if(a[left]>a[right]){
                int t=a[left];a[left]=a[right];a[right]=t;
            }
		}else if(left+1<right){
			//递归条件
			int p=left+((right-left)/2);
			rec(left,p);
			rec(p+1,right);
			sort(left,p,right);
		}
	}
	
	public static void sort(int left,int p,int right){
		int[] t=new int[right-left+1];
		int i=left,j=p+1,index=0;
		while(i<=p&&j<=right){
			if(a[i]>a[j]){
				t[index++]=a[j++];
			}else{
				t[index++]=a[i++];
			}
		}
		while(i<=p){
			t[index++]=a[i++];
		}
		while(j<=right){
			t[index++]=a[j++];
		}
		for(int d=0;d<t.length;d++){
			a[left+d]=t[d];
		}
	}
}
时间空间复杂度

时间复杂度:O( nlogn )

空间复杂度:由于是递归实现,所以空间复杂度为:O(n)

猜你喜欢
数据结构与算法 4311 实现合增链表-合后保持列java描述:单链表链表节点packageclub.test;/****链表节点*@authorjiajia
数据结构与算法 1398 思想将待集合以该集合中随机的一个为分界点分成左右两个集合,一次使其右边的集合的全部大于左边的集合,然后再分别式的对左右两个集合执行上述操作,直到集合没有束完
数据结构与算法 7671 反转链表有一个单向链表t如下:t=1-2-3-4-5-6-7-8-9写一个方反转链表t如下:1-2-3-4-5-6-7-8-9=tjava代码:packagetest;/*** 节点类
数据结构与算法 1118 思想:把所有需要分成两个集合,一个是待集合,一个是已的集合,每次从未集合顺或随机拿取一个,把它加入到已集合使其有,直到未集合中的被取走完,
数据结构与算法 4636 (英语:Heapsort)是指利用堆这种所设计的一种。堆是一个近似完全二叉树的同时满足堆积的性质:即子点的键值或索引总是小于(或者大于)它的父节点。以最小堆为例下沉操
数据结构与算法 1215 思想:希尔是插入的增强版,其主要的思想还是插入的思想。描述:在插入的基础上,对待组进行间隔为inc的分组,然后对每个分组进行直接插入,一次完成后,减小inc
数据结构与算法 4735 实现全c++描述#includeiostreamusingnamespacestd;//交换voidexchange(int*a,inti,intj){if(i==j){return
数据结构与算法 1030 思想:每次从没有的集合a中拿取一个最大或最小的元素,放入有的集合b中,直到a集合中的元素被取完描述:用变量i遍历整个组,用变量j遍历i后面的组,每次交换i比j大的元素,使得i遍历过
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7 2021年04月  4 2021年05月  4 2021年06月  1 2021年07月  7 2021年08月  2 2021年09月  8 2021年10月  9 2021年11月  16 2021年12月  14 2022年01月  7 2022年05月  1 2022年08月  3 2022年09月  2 2022年10月  2 2022年12月  5 2023年01月  3 2023年02月  1 2023年03月  4 2023年04月  2 2023年06月  3 2023年07月  4 2023年08月  1 2023年10月  1 2024年02月  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。