合并排序属于稳定排序的一种,也是一种外部排序。一般用户文件排序,空间复杂度为O(n)
package algorithms;
/**
* 合并排序
* @author heng
* @date 2010-6-26
*/
public class MergeSort {
public static void main(String[] args) {
int[] x = { 10, 2, 33, 44, 0, 55, 1, 8, 7, 6, 20, 19, 35 };
MergeSort ms = new MergeSort();
System.out.println("原数组:");
for (int x1 : x) {
System.out.print(x1 + " ");
}
System.out.println();
System.out.println("=====================================================");
ms.mergeSort(x, 1, x.length);
}
/**
* 排序数据划分
* @param a
* @param start
* @param end
*/
public void mergeSort(int[] a, int start, int end) {
if (start < end) {
int mid = (start + end) / 2;//计算合并的字数组边界
//递归操作
mergeSort(a, start, mid);
mergeSort(a, mid + 1, end);
//合并各字数组
merge(a, start, mid, end);
}
}
/**
* 合并排序方法
*
* 排序后是以小到大的从左往右的顺序
*
* @param a
* @param start
* @param mid
* @param end
*/
public void merge(int[] a, int start, int mid, int end) {
int l1 = mid - start + 1;
int l2 = end - mid;
int[] L = new int[l1];
int[] R = new int[l2];
for (int i = 0; i < L.length; i++) {
L[i] = a[start + i - 1];
}
for (int i = 0; i < R.length; i++) {
R[i] = a[mid + i];
}
int z = 0;
int j = 0;
int k = 0;
for (k = start - 1; k < end - 1; k++) {
if (L[z] < R[j]) {
a[k] = L[z];
z++;
} else {
a[k] = R[j];
j++;
}
if (z >= l1) {
break;
} else if (j >= l2) {
for (int t = z; t < l1; t++) {//把没有处理的数据依序加入数组中
a[++k] = L[t];
}
break;
}
}
for (int x : a) {//每次排序的结果
System.out.print(x + " ");
}
System.out.println();
}
}
分享到:
相关推荐
全面的排序算法实现,包括插入排序、合并排序、堆排序、快速排序。 堆排序:HeapSort 讲解详见http://blog.csdn.net/fly_yr/article/details/8550701 插入排序:InSertion_Sort 讲解详见...
本文将详细讲解六种经典的排序算法——合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合提供的文件名(sort.c、set.c、main.c、set.h、sort.h)推测出每个文件可能包含的代码实现。 1. **合并...
在本案例中,我们将讨论如何利用分治法实现合并排序(Merge Sort),这是一种效率较高的排序算法,其时间复杂度为O(n log n)。 合并排序的基本思想是将原始数组分为两个相等(或接近相等)的部分,对每一部分分别...
【合并排序(分治策略)】是一种高效的排序算法,它采用了经典的分治思想。分治法的基本策略是将一个难以直接解决的大问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题,再将子问题的解组合得到原问题...
合并排序是一种高效的、基于分治思想的排序算法。在C++中实现合并排序,我们可以将大问题分解为小问题,然后逐步解决,最终合并结果。这个程序的核心在于理解分治策略,并能熟练运用C++的编程语法。 首先,我们要...
根据给定的文件信息,我们可以总结出以下关于“C经典算法之合并排序法”的相关知识点: ### 一、概述 本篇文章将介绍一种经典的排序算法——**合并排序法**(Merge Sort),并通过C语言实现该算法。合并排序是一种...
合并排序和快速排序是两种非常重要的排序算法,在计算机科学中占据着核心地位。它们都是基于分治策略(Divide and Conquer)设计的,能够高效地处理大量数据,广泛应用于各种场景,如数据库系统、数据分析、算法竞赛...
这里我们主要探讨两种经典的排序算法:快速排序和合并排序。 快速排序是一种分治算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是选取一个基准元素,将数组分为两部分,一部分的所有元素都小于或...
本文将深入探讨两种常见的排序算法:插入排序和合并排序,并基于一个长度为200000的数组进行性能比较。 **插入排序**是一种简单直观的排序算法,它的基本思想是通过构建有序序列,对于未排序数据,在已排序序列中从...
合并排序是一种基于分治策略的高效排序算法,其基本思想是将大问题分解为小问题,然后逐个解决这些小问题,最后将解决方案合并,得到原问题的解答。在本章中,我们主要讨论了如何利用合并排序算法来对一个包含n个...
分治合并排序是一种基于分治策略的高效排序算法。分治法是计算机科学中解决问题的一种通用方法,它将一个大问题分解成若干个规模较小、相互独立、与原问题形式相同的子问题,然后分别解决子问题,最后将子问题的解...
自底向上的合并排序是一种基于分治思想的高效排序算法,它的主要特点是通过逐步合并小规模的有序序列来构建大规模的有序序列。这种算法避免了传统合并排序在处理大规模数据时需要额外空间的问题,因为它是从最小的...
例如,合并排序的实现可能涉及到动态内存分配、指针操作,而快速排序则需要理解如何使用指针进行数组元素的交换和分割。 在实际编码过程中,我们需要注意以下几点: 1. 递归深度限制:对于大规模数据,要警惕递归...
冒泡排序和合并排序是两种常见的排序算法,它们在计算机科学和编程中有着广泛的应用。在分析这两种排序方法时,时间复杂度是一个重要的衡量标准,它反映了算法执行效率的高低。 首先,我们来讨论冒泡排序。冒泡排序...
自然合并排序是对合并排序的非递归形式的一种改进,很好很有用
合并排序是一种高效的、基于分治思想的排序算法。在C语言中实现合并排序,我们可以深入理解这个算法的原理,以及如何用C语言来编写代码。本文将详细探讨合并排序算法的理论基础,C语言实现的关键步骤,以及如何验证...
合并排序是一种高效的排序算法,基于分治法(Divide and Conquer)的设计理念。在C#中实现合并排序,我们可以遵循以下步骤: 1. **理解合并排序算法**: 合并排序首先将原始数组分为两个子数组,分别对它们进行...
合并排序(Merge Sort)是一种基于分治策略的高效排序算法,它的主要特点是稳定且具有较高的时间效率。在本文中,我们将深入探讨合并排序的工作原理、Java实现细节以及其优势和适用场景。 ### 合并排序的基本思想 ...
/************合并排序算法的实现******************/ int main() { int p,q,r; printf("合并排序算法的实现:\n"); printf("请输入p、q、r的值(输入格式1,12,13):"); scanf("%d,%d,%d",&p,&q,&r); printf("p=%...
合并排序是一种基于分治策略的高效排序算法,它将大问题分解为小问题来解决,然后将小问题的结果合并以得到最终的解决方案。这个过程既可以用递归方式实现,也可以用非递归方式实现。 首先,让我们来看看递归版本的...