`

Java 归并排序(基于数组)

阅读更多

    归并排序:归并算法的中心是归并两个已经有序的数组,并且递归调用归并操作。
    优点和缺点:比简单排序在速度上快很多;归并排序会占用双倍的存储空间。
    效率:归并排序的时间复杂度是 O(N*LogN);简单排序的复杂度是O(N2)。
    每一趟归并的时间复杂度为 O(n), 需要O(logn)次归并

class MergerSort {
	// 归并排序算法
	public void mergeSort(int[] list, int length) {
		int[] temp = new int[length];//临时数组
		recMergeSort(list, temp, 0, length - 1);	}
	// 递归分割数据到基本单位
	private void recMergeSort(int[] list, int[] temp, int low, int upper) {
		if (low == upper) {
			return;
		} else {
			int mid = (low + upper) / 2;
			recMergeSort(list, temp, low, mid);
			recMergeSort(list, temp, mid + 1, upper);
			merge(list, temp, low, mid + 1, upper);
		}
	}
	// 归并操作将基本单位归并成整个有序的数组
	private void merge(int[] list, int[] temp, int left, int right, int last) {
		int j = 0;
		int lowIndex = left;
		int mid = right - 1;
		int n = last - lowIndex + 1;
		while (left <= mid && right <= last) {
			if (list[left] < list[right]) {
				temp[j++] = list[left++];
			} else {
				temp[j++] = list[right++];
			}
		}
		while (left <= mid) {
			temp[j++] = list[left++];
		}
		while (right <= last) {
			temp[j++] = list[right++];
		}
		for (j = 0; j < n; j++) {
			list[lowIndex + j] = temp[j];
		}
	}
	public static void main(String[] args) {
		int arr[] = { 2, 568, 34, 46, 9, 23, 89, 43, 572, 684, 783, 543 };
		MergerSort merger = new MergerSort();
		merger.mergeSort(arr, 12);
		for (int i = 0; i < 12; i++) {
			System.out.print(arr[i] + ",");
		}
	}
}

如图所示:

 

[3 1 4 1 5 9 2 7]

/     \
[3 1 4 1]    [5 9 2 7]

/   \         /   \

[3 1]  [4 1]  [5 9]  [2 7] 
       / \    / \    / \         / \

[3] [1] [4] [1] [5] [9] [2] [7]
   \ /      \ /      \ /      \ /
 [1 3]  [1 4]  [5 9]  [2 7]
      \   /             \   /
   [1 1 3 4]       [2 5 7 9]
             \        /
       [1 1 2 3 4 5 7 9]

 

分享到:
评论
1 楼 liuyuanhui0301 2013-04-07  
    aka~

相关推荐

    java数组排序

    java数组排序的思想,过程和代码实现。多种数组排序的方法,主要有冒泡排序,堆排序,插入排序, 归并操作(merge), 归并操作(merge),选择排序,希尔排序。

    JavaSwing归并排序动画源码(含其他排序)

    一年前做的排序动画,归并排序动画一直未完成,今天完成了,与大家共享

    java代码-java 归并排序(偶数 子数组已排序)

    java代码-java 归并排序(偶数 子数组已排序)

    java算法——归并排序

    归并排序 在排序前,先建好一个长度等于原数组长度的临时数组

    [Java算法-排序]归并排序.java

    该资源提供了一份全面的指南,介绍了如何在Java中实现归并排序。文档中涵盖了归并排序的基本概念,包括如何对数组进行排序以及如何在Java中实现归并排序。此外,文档还包括一个逐步指南,介绍如何在Java中实现归并...

    [Java算法设计]-数组排序.java

    该文档涵盖了数组排序的基本概念,包括如何实现各种排序算法,如冒泡排序、选择排序、插入排序、归并排序和快速排序。此外,文档还为每个排序算法提供了详细的代码示例和实现细节。 该文档还涵盖了高级主题,如如何...

    史上最清晰、最详细的归并排序算法详解:Java示例代码和逻辑解析 保证你是小白也能看懂

    归并排序是一种高效的排序算法,通过将数组逐步分割和合并来实现排序。本教程将深入介绍归并排序的原理,并提供Java示例代码,帮助您理解如何实现这一算法。无论您的编程水平如何,本教程都将为您提供归并排序的全面...

    java各种数组排序

    1.插入排序(直接插入排序、折半插入排序、希尔排序); 2.交换排序(冒泡泡排序、快速排序); 3.选择排序(直接选择排序、堆排序); 4.归并排序;5.基数排序。

    java实现归并排序算法

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

    自然归并排序java版

    自然合并的核心主要是一个Pass函数,这个函数中设置了一个array数组,来存放每一组有序元素的起始元素的下标,最后再将最后一个元素的下标+1存放为array数组的最后一个元素,这样,在后面的合并实现中会显现出这样记录的...

    Java排序算法练习:1.快速排序 2.归并排序 3.插入排序 4.冒泡排序 5.选择排序 6.堆排序

    idea项目:一个主类选择调用6个排序类,记录了学习排序算法的过程,可以自己更改优化,每一种排序是一个类,有需要可以copy走,可重用性强

    Java各种排序算法(含代码)

    Java各种排序算法集合: 1)插入排序(直接插入排序、希尔排序) 2)交换排序(冒泡排序、快速排序) 3)选择排序(直接选择排序、堆排序) 4)归并排序 5)分配排序(箱排序、基数排序)

    将数组元素按照从小到大的顺序排列

    1、 在main方法中创建一个含有10个元素的int型数组,进行以下操作:(1)将数组元素按照从小到大的顺序排列;(2)对排好序的数组使用折半查找(使用递归和非递归两种形式分别实现)查找某一个int元素。

    java一维数组课程作业

    用java实现了一个一维数组类。包括加和、最值、归并排序等

    Java常见的排序算法

    Java中常见的排序算法有以下几种: 冒泡排序(Bubble Sort):通过比较相邻元素的大小,将较大的元素...归并排序(Merge Sort):将数组分成两半,分别对这两部分进行排序,然后将排序后的两部分合并成一个有序序列。

    九种内部排序算法,Java版

    结论:归并排序和堆排序维持O(nlgn)的复杂度,速率差不多,表现优异。固定基准的快排表现很是优秀。而通过使用一个循环完成按增量分组后的直接插入的希尔排序,测试效果显著。 冒泡,选择,直接插入都很慢,而冒泡...

    JAVA十大排序中的-(归并排序)

    前奏 该算法是采用分治法的典型应用,将一个无序序列分组诺干个,然后对该小组进行排序,排序...提示:需要在创建一个同大小的数组 该数组是用来进行临时排序存储合并用的 所谓的空间换时间 课外仅供参考 如果与一组800

    自底向上归并排序和冒泡排序时间对比

    BOTTOMUPSORT排序算法和冒泡排序时间对比,通过生成随机数放到数组里面,再通过大量的数据比较这两种排序算法所用的时间,用JAVA实现。

Global site tag (gtag.js) - Google Analytics