8大排序之 ---------归并排序 与时间复杂度

原创 2016年08月29日 15:02:29

                                            归并排序与时间复杂度

--------------------------

讲归并排序之前,先讲讲什么事递归?递归就是自己调用自己。

比如 f(x)=  x^2+ f(x - 1)且f(0)=0;

这个就是递归,比如你要求f(5)就必须先求出f(4)又得求出f(3)不断的递归下去直到f(0),这里要是没有f(0)=0,那么它就会一直递归下去直到负无穷。这是不允许的,所以f(0)=0是递归的基准情形。

递归的基本法则:(1)必须有基准情形

(2)不断推进 每一次递归都必须向基准情形推进

--------------------------------



(一)什么是归并排序?归并排序就是就是把待排序的数据分成几个子序列,对子序列进行排序后,把有序的子序列合并成整体有序的序列。

(二)递归排序的基本过程:比如现在要排序int a[] = {72,6,57,88,60,42,83,73,48,85};

           那么首先把数组分成两个子序列a1[]= {72,6,57,88,60};  a2 []={42,83,73,48,85};

           接着对a1,a2再分子序列,a11[] = {72,6,57} a12[] = {88,60};

                                                        a21[] = {42,83,73} a22[] = {48,85};

           接着对a11,a21再分子序列a111[] = {72,6} a211= {42,83} 这时候不在会发生递归,接着就是排序

(三)代码如下:

public class GuiBing {

public static void main (String agrs[]){
		
		int a[] = {72,6,57,88,60,42,83,73,48,85};
		guibing_sort(a,0,a.length-1);
		for(int i=0;i<a.length;i++)  
	        System.out.print(a[i]+","); 
	}


public static void guibing_sort(int s[],int low,int high){
	int mid = (low + high)/2;
	if(low < high){
		guibing_sort(s,low,mid);//递归
		guibing_sort(s,mid + 1,high);
		merge(s,low,mid,high);
	}

}

public static void merge(int s[],int low,int mid,int high){//最小的执行单元是2
	//                               0        0        1
	int temp[] = new int[high - low  + 1];//定义一个临时数组用来存放排好的数据
	int i = low;
	int j = mid +1;
	int k = 0;

	// 把较小的数先移到新数组中
	while(i <= mid && j <= high){
		if(s[i]< s[j]){
			temp[k++] = s[i++];
		}else{
			temp[k++] = s[j++];}
	}
	
	// 把左边剩余的数移入数组
	while(i <= mid){
		temp[k++] = s[i++];
	}
	// 把右边边剩余的数移入数组  
	while(j <=  high){
		temp[k++] = s[j++];
	}
	
	// 把新数组中的数覆盖s数组  
    for (int k2 = 0; k2 < temp.length; k2++) {  
       s[k2 + low] = temp[k2];  
    } 
}



(四)时间复杂度:归并排序的时间复杂度为O(nlogn)






















版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

犀利的异或求解

题目:一个数组里只有一个数落单,其余数成对出现,找出落单的这个数。

常用的排序算法的时间复杂度和空间复杂度

常用的排序算法的时间复杂度和空间复杂度排序法 最差时间分析平均时间复杂度 稳定度 空间复杂度 冒泡排序O(n2)O(n2) 稳定 O(1) 快速排序O(n2)O(n*log2n) 不稳定 O(log2...

comprable和comparator的区别

comprable和comparator的区别 (一)comprable和comparator两个接口都是用于比较的。Compartor接口是Java.util包中的接口,而Comparable是ja...

8大排序之-----(3)选择排序与时间复杂度

选择排序与时间复杂度 (一)选择排序的基本思想:选择排序就是每一次从待排序的数据中选出最小的元素,放到已经排好序的数据的最后位                         &...

二分法查找

二分法查找 (一)   二分法查找又叫折半查找,对于已经按从小到大排好序的数组a[],当要查找某个元素b的时候,先计算(a.length - 1)/2 把该位置上的元素与b比较,如果b比a[(a.le...

8大排序之(五)------简单理解 基数排序 与时间复杂度

什么是基数排序? (一)基数排序的思想:把待排序的整数按位分,分为个位,十位.....从小到大依次将位数进行排序。实际上分为两个                         ...

8大排序之-------堆排序与时间复杂度

堆排序 --------------------------------------------------     在介绍堆排序之前先介绍一下什么是完全二叉树,完全二叉树就是在第n层被填满之前,...

8大排序之---(2)希尔排序

希尔排序  (一)基本思想: 希尔排序:     其实就是加强版的插入排序。首先把待排序的数据根据增量分成几个子序列,对子序列进行插入排序,                  ...

8大排序之-----(一)插入排序与时间复杂度

(一)什么是插入排序呢?            插入排序就是每次把待排序的数据一个数据插入到已经排好序的正确位置。就好比,你左手拿着扑克牌,用右手去取牌的时候,把取到的牌放到左手正确的位置。 比如我们...

8大排序之----快速排序与时间复杂度

快速排序 (一)快速排序基本思想:采用分治的思想,从待排序的数据中选一个数作为基数(一般是第一个数),                             ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)