归并排序
归并排序是另一类不同的排序方法,所谓归并,就是把两个或者两个以上的有序表合并成一个新的有序表的过程。
归并排序的基本思想:
将一个含有n个序列的有序表看成是n个长度为1的有序表,然后两两归并,得到[n/2]个长度为2的有序表,然后再两两归并,直到得到一个长度为n的有序表为止。
下面是归并排序的一个简单的例子:
初始值 【49】 【38】 【65】 【97】 【76】 【13】 【27】
看成由长度为1的7个子序列组成
第一次合并之后 【38 49】 【65 97】 【13 76】 【27】
看成由长度为1或2的4个子序列组成
第二次合并之后 【38 49 65 97】 【13 27 76】
看成由长度为4或3的2个子序列组成
第三次合并之后 【13 27 38 49 65 76 97】
归并排序的JAVA实现:
public class MergeSort {
/**
* 归并排序 先将初始的序列表看成是n个长度为1的有序表 (1)定义指针i,指向第一个序列表的第一个元素
* (2)定义指针j,指向第二个序列表的第一个元素 (3)比较i,j指向的元素大小,若前者大,将后者插入到新表中 否则,把前者插入到后表中
* (4)直到取完第一个序列表或者第二个序列表为止
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] num = { 51, 38, 49, 27, 62, 05, 16 };
int[] num1 = new int[7];
num = mergesort(num, 0, num.length - 1, num1);
for (int i : num) {
System.out.print(i + " ");
}
}
private static int[] mergesort(int[] num, int s, int t, int[] num1) {
int m;
int[] num2 = new int[t + 1];
if (s == t)
num1[s] = num[s];
else {
m = (s + t) / 2;
mergesort(num, s, m, num2);//左半部分递归调用
mergesort(num, m + 1, t, num2);//右半部分递归调用
merg(num2, s, m, t, num1);// 由num2去归并,返回的值放到num1中,num1赋新值,其实就是更新num2,然后让num2再去归并,返回新的num1
}
return num1;
}
//有序表的合并
private static void merg(int[] num, int l, int m, int n, int[] num1) {
System.out.print("l=" + l + " m=" + m + " n=" + n);
System.out.println();
int i, j, k;
i = l;
j = m + 1;
k = l;
while (i <= m && j <= n) {
if (num[i] < num[j])
num1[k++] = num[i++];
else {
num1[k++] = num[j++];
}
}
while (i <= m) {
num1[k++] = num[i++];
}
while (j <= n) {
num1[k++] = num[j++];
}
}
}
性能分析:
时间复杂度:
由于归并的趟数,等于树的高度Logn,每趟归并需要移动记录n次,因此归并排序的时间复杂度为nlogn.
空间复杂度:
从上面的算法可以看出,需要一个辅助空间num2,其长度等于n,所以归并排序的辅助空间为O(n).
稳定性:
归并排序不涉及到交换,因此它是一种稳定的排序算法。
归并排序是典型的用空间去换取时间,它的时间开销比简单排序要优越,但需要与序列等长的辅助空间。
分享到:
相关推荐
根据给定的文件信息,我们将深入探讨两种经典的排序算法——快速排序和归并排序,并结合Java语言实现进行详细解析。 ### 快速排序算法 快速排序是一种高效的排序算法,采用分而治之的策略,其核心思想是选择一个...
本文将详细介绍C++中实现的希尔排序、快速排序、堆排序和归并排序这四种经典排序算法。 希尔排序,由Donald Shell于1959年提出,是一种改进的插入排序。它的基本思想是通过设置一个增量序列,将待排序的元素按照...
### C++排序算法之归并排序源码解析 #### 归并排序简介 归并排序是一种高效的、基于分治策略的排序算法。它利用了分而治之的思想,通过递归地将数组分成越来越小的部分,然后将这些部分重新合并为更大的、已排序的...
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
各种常用c++排序算法,包括插入排序、冒泡排序、选择排序、快速排序、归并排序、希尔排序等
Java常用排序算法-归并排序 归并排序是一种分治思想的排序算法,其基本思想是将待排序的数组分成若干个子序列,每个子序列都是有序的,然后再将子序列合并成一个有序的数组。这种算法的时间复杂度为O(n log n),...
本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...
python python_十大排序算法之归并排序
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...
直接插入排序、冒泡排序、快速排序、直接选择排序、堆排序和二路归并排序是计算机科学中经典的排序算法,它们在数据处理和算法学习中占有重要地位。这些排序算法各有特点,适用场景不同,下面将逐一详细介绍,并结合...
归并排序(Merge Sort)是一种非常有效的排序算法,尤其在处理大量数据时表现出良好的稳定性和效率。 归并排序的基本思想源于分治法,即将大问题分解为小问题来解决。在归并排序中,我们首先将待排序的序列拆分为两...
归并排序是一种经典的排序算法,采用分治法的思想,将待排序数组分为若干个子序列,这些子序列是已排序的,然后再按照一定的方式合并这些子序列得到最终排序后的数组。归并排序在实际应用中非常广泛,尤其在处理大...
归并排序是一种基于**分而治之**策略的经典排序算法。它将一个数组分成两半,递归地对每一半进行排序,然后将排序后的两部分合并成一个有序数组。 #### 二、归并排序的基本步骤 归并排序主要由两个关键步骤组成: ...
自动生成500个随机数,然后对这500个随机数进行归并排序
这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试,揭示它们在处理不同规模数据时的效率差异。 **快速排序(Quick Sort)** 快速排序由C.A.R. Hoare在...
归并排序是基于分治策略的排序算法,将大问题分解为小问题解决。它将序列分为两半,分别排序,然后合并两个有序子序列。归并排序的时间复杂度始终为O(n log n),但需要额外的空间O(n)。 7. **快速排序**: 快速...
归并排序算法是一种高效稳定的排序方法,其基本思想源于分治法。该算法将一个大问题分解成两个或更多的小问题来解决,然后再合并这些小问题的解,从而得到最终的大问题的解。在归并排序中,我们将一个大的数组分割成...
归并排序是一种高效的、稳定的排序算法,由著名计算机科学家John W. Backus在1946年提出。它是基于分治策略的一种经典算法,适用于处理大量数据。在本系列的第一部分,我们将深入探讨归并排序的基本原理、实现过程...
本文将对快速排序、归并排序、堆排序等常见排序算法进行比较和分析,探讨它们的优缺点和适用场景。 首先, let's 看一下这些排序算法的时间复杂度和空间复杂度: | 排序算法 | 平均情况 | 最好情况 | 最坏情况 | ...
本篇介绍一种具体的实现方法——二路归并排序,并通过C语言来实现。 #### 关键概念 在了解二路归并排序之前,我们需要先明确几个关键的概念: 1. **分治法**:这是一种解决问题的方法论,即将问题分解为两个或更...