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

硅谷探秘者 384 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)

猜你喜欢
数据结构与算法 3510 实现合增链表-合后保持列java描述:单链表链表节点packageclub.test;/****链表节点*@authorjiajia
数据结构与算法 398 思想将待集合以该集合中随机的一个为分界点分成左右两个集合,一次使其右边的集合的全部大于左边的集合,然后再分别式的对左右两个集合执行上述操作,直到集合没有束完
数据结构与算法 6863 反转链表有一个单向链表t如下:t=1-2-3-4-5-6-7-8-9写一个方反转链表t如下:1-2-3-4-5-6-7-8-9=tjava代码:packagetest;/*** 节点类
数据结构与算法 323 思想:把所有需要分成两个集合,一个是待集合,一个是已的集合,每次从未集合顺或随机拿取一个,把它加入到已集合使其有,直到未集合中的被取走完,
数据结构与算法 3852 (英语:Heapsort)是指利用堆这种所设计的一种。堆是一个近似完全二叉树的同时满足堆积的性质:即子点的键值或索引总是小于(或者大于)它的父节点。以最小堆为例下沉操
数据结构与算法 352 思想:希尔是插入的增强版,其主要的思想还是插入的思想。描述:在插入的基础上,对待组进行间隔为inc的分组,然后对每个分组进行直接插入,一次完成后,减小inc
数据结构与算法 3906 实现全c++描述#includeiostreamusingnamespacestd;//交换voidexchange(int*a,inti,intj){if(i==j){return
数据结构与算法 298 思想:每次从没有的集合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
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo
目录