一. 排序方法
- 归并排序(Merge Sort)是利用"归并"技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件。
- 给定数组data[0...n],若data[0...m]和data[m+1...n]两个子数组均已经有序。
- 可以先将两个子数组合并到一个临时数组tmpAr[0...n]里面。
- 然后将tmpAr复制到原data数组里面。
- 合并过程
- 合并过程中,设置i,j和p三个指针,其初值分别指向这三个记录区(两个子数组和一个临时数组)的起始位置。
- 合并时依次比较data[i]和data[j]的关键字,取关键字较小的记录复制到tmpAr[p]中,然后将被复制记录的指针i或j加1,以及指向复制位置的指针p加1。
- 重复这一过程直至两个子数组有一个已全部复制完毕(不妨称其为空),此时将另一非空的数组中剩余记录依次复制到tmpAr中即可。
二.动画演示
http://student.zjzk.cn/course_ware/data_structure/web/flashhtml/guibingpaixu.htm
三. Java代码
/*将索引从left到right范围的数组元素进行归并排序
* data 待排序数组
* left 待排序数组的第一个元素索引
* right 待排序数组的最后一个元素索引
*/
public static void sort(int[] data, int left, int right) {
// TODO Auto-generated method stub
if(left<right){
//找出中间索引
int center=(left+right)/2;
//对左边数组进行递归
sort(data,left,center);
//对右边数组进行递归
sort(data,center+1,right);
//合并
merge(data,left,center,right);
}
}
/*将两个数组进行归并,归并前两个数组已经有序,归并后依然有序
* data 数组对象
* left 左数组的第一个元素的索引
* center 左数组的最后一个元素的索引,center+1是右数组第一个元素的索引
* right 右数组的最后一个元素的索引
*/
private static void merge(int[] data, int left, int center, int right) {
// TODO Auto-generated method stub
int [] tmpArr=new int[data.length];
int mid=center+1;
//third记录临时数组tmpArr的索引
int third=left;
int tmp=left;
while(left<=center&&mid<=right){
//从两个数组中取出最小的放入中间数组
if(data[left] <= data[mid]){
tmpArr[third++]=data[left++];
}else{
tmpArr[third++]=data[mid++];
}
}
//剩余部分依次放入中间数组
while(mid<=right){
tmpArr[third++]=data[mid++];
}
while(left<=center){
tmpArr[third++]=data[left++];
}
//将中间数组中的内容复制回原数组
while(tmp<=right){
data[tmp]=tmpArr[tmp++];
}
System.out.println(Arrays.toString(data));
}
四. 时间复杂度和稳定性
- 时间复杂度
- 对长度为n的文件,需进行logn趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlogn)。
- 空间复杂度
- 归并排序需要一个辅助向量来暂存两有序子文件归并的结果,故其辅助空间复杂度为O(n),显然它不是就地排序。
- 归并排序是一种稳定的排序。
分享到:
相关推荐
**归并排序是一种高效...通过理解归并排序的工作原理和C语言实现的细节,你可以更好地掌握数据结构中的排序算法,并在实际编程中灵活应用。无论是在学习阶段还是在实际开发中,掌握这种高效的排序方法都是非常有益的。
《数据结构算法与应用-C++语言描述》这本书,由Sahni著,旨在帮助读者深入理解这些核心概念,并通过C++实践来提升技能。 本书可能涵盖了以下几个主要的知识点: 1. **基础数据结构**:包括数组、链表、栈、队列、...
《数据结构、算法与应用:C++语言描述》是一本专为计算机科学和技术领域的学生以及专业人士编写的经典教材。本书的核心目标是通过C++编程语言,深入浅出地讲解数据结构、算法及其在实际问题中的应用。以下是该书可能...
在编程领域,数据结构与算法是核心组成部分,它们直接影响到程序的效率和性能。Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点...
在IT领域,排序是计算机科学中的基础概念,尤其在数据结构和算法的学习中占据着重要地位。本资源“C/C++数据结构_随机10000个数:排序~8大排序代码集.rar”提供了C/C++实现的八种经典排序算法,适合初学者深入理解和...
排序算法则是数据结构中的重要部分,它们用于对一组数据进行有序排列。在这个实验中,我们将关注六种不同的排序算法:选择排序、冒泡排序、插入排序、基数排序以及快速排序和归并排序。下面是对这些排序算法的详细...
数据结构与算法是计算机科学的基础,对于理解和设计高效的软件至关重要。C语言因其高效、底层特性,常被用于实现数据结构和算法,使得程序更接近硬件,性能更优。本资源"数据结构与算法分析--C语言描述"是针对数据...
JS 数据结构与算法.pdf 本书主要介绍了 JavaScript 语言的基础知识,包括数据结构和算法。以下是该书的详细知识点: 一、JavaScript 基础知识 * 变量和数据类型 * 运算符和控制结构 * 函数和对象 * 数组和字符串 ...
北京工业大学,电控学院,《数据结构与算法》。本资源是北工大电控学院大一下学期课程《数据结构与算法》的课程实验。 本资源为数据结构与算法第三章(排序)的实验程序代码。包含以下的三个程序:1.快速排序;2....
在本资源中,我们主要关注的是使用MATLAB编程语言实现三种经典的排序算法:插入排序、二分归并排序以及归并排序。这些算法是计算机科学基础中的重要组成部分,特别是在算法设计与分析领域。MATLAB是一种强大的数值...
《数据结构与算法分析——C++描述》是Mark Allen Weiss教授撰写的一本经典教材,针对计算机科学中的核心主题——数据结构和算法进行了深入浅出的阐述。这本书的第三版不仅涵盖了基本的数据结构如数组、链表、栈、...
数据结构与算法是计算机科学的基础...通过上述资源,你可以系统地学习数据结构与算法,不断积累实践经验,提升编程能力。记住,理解和掌握数据结构与算法是提升编程技能的关键步骤,也是通往高级软件工程师之路的基石。
Java数据结构与算法学习笔记之排序,主要探讨了六种常见的排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序和快速排序。这些排序算法是计算机科学的基础,无论是在日常开发还是面试中都经常遇到。现在...
《数据结构与算法分析C++语言描述第四版》是一本深度探讨数据结构和算法的经典教材。这本书由Mark Allen Weiss撰写,旨在帮助读者理解和掌握如何在C++编程环境中有效地设计和实现数据结构及算法。第四版更新了内容,...
《数据结构算法与应用:C++语言描述》这本书旨在深入浅出地介绍数据结构的基本概念、设计原理以及C++中的实现方式,并结合习题来帮助读者巩固理解和提高实践能力。 本书首先会讲解基本的数据结构,如数组、链表、栈...
《数据结构与算法分析:C语言描述》是计算机科学领域的一本经典著作,由Mark Allen Weiss撰写,旨在深入探讨数据结构和算法,并采用C语言作为实现工具。这本书的第二版在原有基础上进行了更新和改进,增加了更多的...
严蔚敏教授的《数据结构》是一本经典的教材,其中第十章专门讲解了内部排序算法。内部排序,指的是数据在计算机内存中进行的排序过程,相对于外部排序,其处理的数据量相对较小,但要求快速、高效。 在这一章中,...
《“数据结构与算法”课程学习总结报告》 在学习“数据结构与算法”这门课程时,我们深入了解了线性结构、树结构和图结构中的数据表示与处理方法。这些知识是计算机科学中的基石,对于高效编程和优化至关重要。课程...
《数据结构与算法Java》是由周鹏编著的一本深入探讨数据结构与算法的书籍,主要面向Java开发者。这本书详细地介绍了数据结构和算法的基础知识,对于提升编程能力,优化程序设计有着重要的指导意义。 首先,我们要...