`

MergeSort Algorithm 归并排序 例子

阅读更多
摘自 http://www.vogella.com/articles/JavaAlgorithmsMergesort/article.html


这个对本人实在是很有难度。。

起初是在java的Collections.sort()的api里面看到, 说是java所使用的排序是修改了的mergesort .- The sorting algorithm is a modified mergesort (in which the merge is omitted if the highest element in the low sublist is less than the lowest element in the high sublist).

网上查了一下就看到这个。
拿着纸和比在debug模式里研究了半天,大概明白了那么一点点。

实现代码:
public class Mergesort
{
	private int[] numbers;
	
	
	/**
	 * int[] helper在算法中起到存放数据并和numbers里进行大小比较的作用。
	 */
	private int[] helper;
	
	/**
	 * number是要排序的数组的大小
	 */
	private int number;
	
	public void sort(int[] values){
		this.numbers=values;
		number=values.length;
		this.helper=new int[number];
		mergesort(0,number-1);
	}
	
	private void mergesort(int low, int high){
		//check if low is smaller than high, if not
		//then the array is sorted.
		if(low<high){
			//get the index of the element which is in the middle
			int middle=low+(high-low)/2;
			//sort the left side of the array
			mergesort(low,middle);
			
			//sort the right side of the array
			mergesort(middle+1, high);
			
			//combine them both
			merge(low,middle,high);
		}
	}
	
	
	
	
	private void merge(int low, int middle, int high){
		//copy both parts into the helper array
		for(int i=low; i<=high; i++){
			helper[i]=numbers[i];
		}
		int i=low;
		int j=middle+1;
		int k=low;
		
		//copy the smallest values from either the left or the right
		//side back to the original array
		while(i<=middle&&j<=high){
			//这里进行排序,如果helper[i]和helper[j]根据大小进行位置调整
			//比如helper[0]==3和helper[1]==1,则进入if里面
			//number[1]=helper[0]
			if(helper[i]<=helper[j]){
				numbers[k]=helper[i];
				i++;
			}else{
				numbers[k]=helper[j];
				j++;
			}
			
			//k代表numbers的索引,是一定会加1的。因为这里就是要将helper[i]
			//和helper[j]做比较。最终将小的那个值放入numbers[k]
			k++;
		}
		
		//copy the rest of the left side of the array into the target array
		while(i<=middle){
			//完成刚才排序的位置调整
			numbers[k]=helper[i];
			k++;
			i++;
		}
	}
	 
	
}




测试代码:
public class Test01
{
	public static void main(String[] args)
	{
		  int[] numbers={3,1,2,6,7,3,4};
		  
		  
		  Mergesort sorter=new Mergesort();
		  
		  sorter.sort(numbers);
		 
		  for(int i:numbers){
			  System.out.println(i);
		  }
		  //1 2 3 3 4 6 7

	}
}



jdk的各种算法包括binary search,mergesort都在Arrays类里面。
都是加入了泛型的。
都是sun公司的高手写的。 想提高的话可以去研究研究。。
分享到:
评论

相关推荐

    三路归并_C语言_三路归并排序_三路归并_

    **三路归并排序**是一种高效的排序算法,尤其在处理含有大量重复元素的序列时表现优秀。该算法基于归并排序的思想,但将其分为三个部分处理,而不是传统的两个部分。在本文中,我们将深入探讨三路归并排序的原理、...

    java实现归并排序

    Java实现归并排序 Java 实现归并排序是一种常用的排序算法,通过分治策略将原始数组分成小组,然后对每个小组进行排序,最后将排序好的小组合并成一个有序数组。下面是 Java 实现归并排序的知识点总结: 基本思想 ...

    MergeSort:归并排序算法的实现

    归并排序(Merge Sort)是一种基于分治策略的高效排序算法。它的基本思想是将待排序的序列分为两部分,分别进行排序,然后再合并这两部分,以达到整体有序的效果。这个过程可以递归地应用于每一部分,直到每个部分只...

    归并排序算法实现

    ### 归并排序算法实现详解 #### 一、引言 归并排序是一种经典的排序算法,采用分治法的思想,将待排序数组分为若干个子序列,这些子序列是已排序的,然后再按照一定的方式合并这些子序列得到最终排序后的数组。...

    归并排序C++实现的例子

    归并排序(Merge Sort)是一种高效的排序算法,其主要基于分治法(Divide and Conquer)的思想。在C++中实现归并排序,我们需要理解以下几个关键知识点: 1. **分治法**:分治法是计算机科学中常用的一种算法设计...

    二路归并排序

    MergeSort 函数是二路归并排序的主函数,它将待排序的记录分成多个部分,然后对每个部分进行排序,最后将已排序的部分合并成一个有序的序列。 实验结果 实验结果显示了二路归并排序的过程,每一趟的排序结果都会被...

    归并排序Java_归并排序_

    在Java中实现归并排序,我们可以创建一个名为`MergeSort`的类来封装整个过程。归并排序的基本思想是将待排序的序列分成两个或更多的子序列,对每个子序列分别进行排序,然后将排序后的子序列合并成一个有序序列。这...

    数据结构 排序算法之归并排序

    在`MergeSort.cpp`文件中,我们可以期待看到归并排序的C++实现。通常,C++代码会包含以下几个关键部分: - `merge()`函数:用于合并两个已经排序的子序列。这个函数通常使用两个指针分别遍历两个子序列,比较它们的...

    mergesort:归并排序算法并行顺序实现

    归并排序(Merge Sort)是一种基于分治策略的高效排序算法,它的主要思想是将大问题分解成小问题,然后逐个解决这些小问题,最后再将这些小问题的解合并起来,形成整个问题的解。这个过程可以递归地进行,直到每个子...

    分治策略---归并排序

    ### 分治策略与归并排序 #### 一、分治策略概述 在计算机科学领域,分治(Divide and Conquer)是一种非常重要的算法设计思想。它的基本思想是将一个复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子...

    理解归并排序的算法思想及其算法设计

    归并排序的实现过程可以分为两个函数:Mergesort 函数和 Mergepass 函数。Mergesort 函数用于控制归并的流程,而 Mergepass 函数用于实现两两归并的操作。 4. 归并排序的时间复杂度分析 归并排序的时间复杂度为 O...

    归并排序MERGESORT

    归并排序 归并排序 归并排序 归并排序 归并排序

    用单链表和队列实现归并排序

    归并排序是一种高效的排序算法,基于分治策略。在计算机科学中,分治法是一种将大问题分解为小问题来解决的方法。归并排序的基本思想是将待排序的数据分成两个或更多的子序列,分别对这些子序列进行排序,然后将排好...

    算法设计实验报告-快速排序和归并排序

    本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...

    8645 归并排序 (非递归算法).txt

    `MergeSort`函数实现了非递归的归并排序逻辑。它首先初始化了一个增量`m`,用于控制每次归并操作的跨度。接着,通过外层循环控制每次归并操作的范围,内层循环调用`SortPart`函数对数组的子段进行排序。值得注意的是...

    C语言算法之归并排序C语言算法之归并排序

    ### C语言中的归并排序详解 #### 一、归并排序的基本概念与原理 归并排序是一种基于**分而治之**策略的经典排序算法。它将一个数组分成两半,递归地对每一半进行排序,然后将排序后的两部分合并成一个有序数组。 ...

    归并排序的非递归实现

    归并排序的非递归实现是指使用迭代的方式实现归并排序算法,而不是使用递归的方式。下面是对归并排序的非递归实现的知识点总结: 一、归并排序的基本概念 归并排序是一种常用的排序算法,它的基本思想是将需要排序...

    mergesort:归并排序正确性证明

    归并排序 (相当)无痛依赖类型编程的案例:Agda 中完全认证的归并排序 Agda 中的合并排序正确性证明 我们在 Agda 中展示了一个经过完全认证的合并排序版本。 它的特点是:终止的句法保证(即不需要明确的终止证明)...

    可视化归并排序

    在项目中,`MergeSort`很可能是一个包含所有核心逻辑的类,包括归并排序的实现、与Swing GUI的交互以及生产者-消费者模型的管理。源码可能包括以下部分: - `main`方法:启动程序,初始化数组和GUI。 - `mergeSort`...

    归并排序 数据结构

    `MergeSort`函数是归并排序的核心,它通过递归调用自身来分解数组。`Merge`函数负责合并两个已排序的子数组,而`Copy`函数用于在数组之间复制元素。 在C++代码中,`ArraySort`类封装了归并排序的逻辑,包含`elem`...

Global site tag (gtag.js) - Google Analytics