`
leichenlei
  • 浏览: 125352 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

排序(2)归并排序(递归、合并排序)

 
阅读更多

用到递归、合并,所以叫归并。

public static int[] data = {3,7,8,0,9,5,4,1,6,2};
	/**
	 * 递归
	 * @param temp 临时数组
	 * @param sIndex 开始索引
	 * @param eIndex 结束索引
	 */
	private static void recursion(int[] temp, int sIndex, int eIndex){
		if(sIndex == eIndex){
			return ;
		}else{
			int oneEnd = (sIndex + eIndex) / 2; //分成2半,不能整除放前面
			recursion(temp, sIndex, oneEnd);  //前个
			recursion(temp, oneEnd + 1, eIndex); //后个
			merge(temp, sIndex, oneEnd, eIndex);
		}
	}
	/**
	 * 合并
	 * @param temp 临时数组
	 * @param oneStart 合并的第一个数组开始索引
	 * @param oneEnd 合并的第一个数组结束索引
	 * @param twoEnd 合并的第二个数组结束索引
	 */
	private static void merge(int[] temp, int oneStart, int oneEnd, int twoEnd){
		int twoStart = oneEnd + 1; //合并的第二个数组开始索引
		int start = oneStart; //记录开始索引,以便放回原数组
		int end = twoEnd; //记录结束索引,以便放回原数组
		int i = 0; //计数器
		while(oneStart <= oneEnd && twoStart <= twoEnd){
			if(data[oneStart] < data[twoStart]){
				temp[i++] = data[oneStart++];
			}else{
				temp[i++] = data[twoStart++];
			}
		}
		while(oneStart <= oneEnd){//处理剩余
			temp[i++] = data[oneStart++];
		}
		while(twoStart <= twoEnd){//处理剩余
			temp[i++] = data[twoStart++];
		}
		//放回原数组
		for(int j = start; j <= end; j++){
			data[j] = temp[j - start];
		}
	}
	public static void main(String[] args) {
		int[] space = new int[data.length];
		recursion(space, 0, data.length - 1);
		System.out.println(Arrays.toString(data));
	}

 

分享到:
评论

相关推荐

    c++合并排序算法递归与非递归方式

    c++实现的合并排序算法 用递归和非递归两种方式实现的

    归并排序,消除递归归并排序,快排,Java实现

    归并排序,消除递归归并排序,快排,Java实现

    [排序算法] 9. 归并排序递归与非递归实现及算法复杂度分析(分治算法、归并排序、复杂度分析)

    文章目录1. 基本思想2. 代码实现2.1 递归实现2.2 优化—非递归实现3...归并排序与快速排序的思想基本一致,唯一不同的是归并排序的基准值是数组的中间元素 快排 Link:[排序算法] 6. 快速排序多种递归、非递归实现及性能

    非递归归并排序详细分析

    非递归归并排序详细分析,Java实现. 非常详细,基本上可以看明白

    归并排序程序文件,C语言程序。递归写法。

    合并排序的C程序。递归写法。第一次上传文件。谢谢大家支持。

    利用递归算法实现的归并排序的java程序

    一个Java小程序,利用递归思想实现的归并排序算法。其中有两个类,排序数据是写死在main方法中的。

    实验2--归并排序

    1.划分:将待排序序列P1,P2,.......Pn划分成两个长度相等的子序列P1,P2,....求解子问题:分别对这个子序列进行归并排序,得到两个有序子序列.(递归实现和非递归实现) 3.合并:将这两个有序子序列合并成一个有序序列.

    归并排序的递归实现与非递归实现代码

    归并排序归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。值得注意的是归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列...

    用递归和非递归两种方式实现归并排序

    归并排序是一种基于分治思想的排序算法,它将待排序的数组分成两部分,分别对这两部分递归地进行排序,最后将两个有序子数组合并成一个有序数组。它的时间复杂度为O(nlogn)。 归并排序的基本思路是将待排序的数组...

    Java实现归并排序算法(源代码)

    归并排序是一种基于分治策略的排序算法,它将待排序的数组分成若干个子数组,每个子数组再递归地进行排序,最后将已排序的子数组合并成一个完整的有序数组。该算法的核心在于合并两个有序数组的操作,通过比较两个...

    scau归并排序(归并排序是一种经典的分治思想的排序算法)

    归并排序是一种经典的分治思想的排序算法,它基于“分而治之”的策略,将待排序序列不断地二分,并对两个子序列分别进行递归排序,最终合并两个有序序列。由于其时间复杂度稳定在 O(nlogn) 级别,归并排序被称为算法...

    Python3实现归并排序(源代码)

    归并排序是一种基于分治策略的排序算法,它将待排序的数组分割成若干个子数组,然后递归地对这些子数组进行排序,最后将已排序的子数组合并成一个完整的有序数组。归并排序的实现过程包括分解和合并两个主要步骤:...

    C#递归算法之归并排序

    归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: 1)划分子表 2)合并半子...

    归并排序 算法练习

    算法练习,仅供参考 用递归实现的一个归并算法 void Merge(int *A,int p,int q,int r)实现对已排序的两部分合并 void Merge_sort(int *A,int p,int r) 调用上述函数实现排序

    多路归并之根号n排序

    绝大多数归并算法是每次n/2分,然后再合并排序。而本算法是将n维数组每次分为根号n后递归后归并排序,思想和二路归并类似,不同!

    java实现归并排序算法

    mergeSort 方法实现了归并排序算法。它使用递归的方式将数组不断划分为更小的子数组,直到每个子数组只有一个元素,然后再依次将这些子数组进行合并,从而实现排序。 merge 方法用于合并两个有序子数组。它借助两个...

    数据结构-归并排序.doc

    归并排序 实验题目:归并排序 实验要求:对输入的一组数据利用归并排序算法进行排序并输出 1 需求分析 本实验要求对输入的一组数据利用归并排序算法进行排序并输出。 归并排序是利用归并过程的算法。所谓归并,是指...

    C语言用分治法实现数组归并排序算法实现

    归并排序的过程是,将数组分为许多的组,即将数组元素多的数组分为数组元素少的数组,然后再将其合并。它的优点是,同时对多个数据进行对比排序,归并排序是分治法的典型应用。 分:体现在将数组分为小数组。 治:对...

    C语言分治法实现归并排序

    本文实例为大家分享了C语言实现归并排序的具体代码,供大家参考,具体内容如下 归并排序的基本思想: 将两个及其以上的有序表合并为一张有序表,把待排序序列通过分治法分为若干个有序子序列,然后每两个子序列合并...

    合并排序的C++实现

    合并排序的C++实现方法。使用递归方法实现。要求用户输入n个整数,程序输出排序结果

Global site tag (gtag.js) - Google Analytics