闲来无事,来写写合并排序,第一次看到合并排序,我相信大家可能像我一样感觉看的有点迷糊,特别合并排序的思想:是将一个数组分成2个较小有序的数组,然后才进行合并排序。迷糊的地方:主要是下面涂色的地方,在归并前2个数组有序(怎么有序呢?),然后只要大家联想到递归或者树的遍历就知道,在将每个较大的数组拆分的时候呈现一个树形,到最后只有一个数字(有序),然后再依此合并。
import java.util.*;
public class Merge1
{
private int[] bridge;
public static void main(String args[])
{
int[] brige={34,12,43,5,89,3};
Merge1 mg=new Merge1();
mg.sort(brige);
for(int i=0;i<brige.length;i++)
System.out.println(" "+brige[i]);
}
/**
*利用归并排序算法对数组obj进行排序
*/
public void sort(int[] obj)
{
bridge = new int[obj.length]; //初始化中间数组
mergeSort(obj, 0, obj.length - 1); //归并排序
//bridge = null;
}
/**
*将下标从left到right的数组进行归并排序
*@param obj 要排序的数组的句柄
*@param left 要排序的数组的第一个元素下标
*@param right 要排序的数组的最后一个元素的下标
*/
private void mergeSort(int[] obj, int left, int right)
{
if (left < right)
{
int center = (left + right)/2;
mergeSort(obj, left, center);
mergeSort(obj, center + 1, right);
merge(obj, left, center, right);
}
}
/**
*将两个对象数组进行归并,并使归并后为升序。归并前两个数组分别有序
*@param obj 对象数组的句柄
*@param left 左数组的第一个元素的下标
*@param center 左数组的最后一个元素的下标
*@param right 右数组的最后一个元素的下标
*/
private void merge(int[] obj, int left, int center, int right)
{
int mid = center + 1;
int third = left;
int tmp = left;
while (left <= center && mid <= right)
{
//从两个数组中取出小的放入中间数组
if (obj[left]<=obj[mid])
{
bridge[third++] = obj[left++];
}
else
bridge[third++] = obj[mid++];
}
//剩余部分依次置入中间数组
while (mid <= right)
{
bridge[third++] = obj[mid++];
}
while (left <= center)
{
bridge[third++] = obj[left++];
}
//将中间数组的内容拷贝回原数组
copy(obj, tmp, right);
}
/**
*将中间数组bridge中的内容拷贝到原数组中
*@param obj 原数组的句柄
*@param left 要拷贝的第一个元素的下标
*@param right 要拷贝的最后一个元素的下标
*/
private void copy(int[] obj, int left, int right)
{
while (left <= right)
{
obj[left] = bridge[left];
left++;
}
}
}
分享到:
相关推荐
全面的排序算法实现,包括插入排序、合并排序、堆排序、快速排序。 堆排序: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=%...
合并排序是一种基于分治策略的高效排序算法,它将大问题分解为小问题来解决,然后将小问题的结果合并以得到最终的解决方案。这个过程既可以用递归方式实现,也可以用非递归方式实现。 首先,让我们来看看递归版本的...