JAVA实现归并排序算法

package Utils.Sort;
/**
*归并排序,要求待排序的数组必须实现Comparable接口
*/
public class MergeSort implements SortStrategy
{ private Comparable[] bridge;
    /**
    *利用归并排序算法对数组obj进行排序
    */
    public void sort(Comparable[] obj)
    {  if (obj == null)
       {  throw new NullPointerException("The param can not be null!");
       }
       bridge = new Comparable[obj.length]; //初始化中间数组
       mergeSort(obj, 0, obj.length - 1); //归并排序
       bridge = null;
    }
    /**
    *将下标从left到right的数组进行归并排序
    *@param obj 要排序的数组的句柄
    *@param left 要排序的数组的第一个元素下标
    *@param right 要排序的数组的最后一个元素的下标
    */
    private void mergeSort(Comparable[] 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(Comparable[] 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].compareTo(obj[mid]) <= 0)
           {   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(Comparable[] obj, int left, int right)
    {  while (left <= right)
       {  obj[left] = bridge[left];
           left++;
       } }
}

时间: 2024-10-02 12:25:07

JAVA实现归并排序算法的相关文章

java实现归并排序算法_java

归并排序就是将未排序的数组进行对半划分成两个数组,划分后的数组只有原来数组的一半数量的元素.然后在对划分的两个数组再继续划分,循环此操作,直到划分的数组中只有一个元素时停止划分,然后对于划分完成的数组进行归并排序操作.将两个已经划分完成的数组合并成一个有序的数组,直到最后合并成一个包含所有元素的数组,合并排序操作完成.下面以图形来演示下归并排序的过程. 假设有一个未排序数组:{3,2,4,1},下面为数组的划分过程,先将数组对半划分为{3,2}和{4,1}两个数组.然后在对这两个数组进行划分最后

深入探究TimSort对归并排序算法的优化及Java实现_java

简介MergeSort对已经反向排好序的输入时复杂度为O(n^2),而timsort就是针对这种情况,对MergeSort进行优化而产生的,平均复杂度为n*O(log n),最好的情况为O(n),最坏情况n*O(log n).并且TimSort是一种稳定性排序.思想是先对待排序列进行分区,然后再对分区进行合并,看起来和MergeSort步骤一样,但是其中有一些针对反向和大规模数据的优化处理. 归并排序的优化思想归并排序有以下几点优化方法: 和快速排序一样,对于小数组可以使用插入排序或者选择排序,

浅析java 归并排序算法_java

归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,称为2-路归并. 归并排序算法稳定,数组需要O(n)的额外空间,链表需要O(log(n))

Java实现快速排序算法(Quicktsort)

 这篇文章主要介绍了Java实现快速排序算法(Quicktsort),有需要的朋友可以参考一下 快速排序算法介绍 快速排序和归并排序都使用分治法来设计算法,区别在于归并排序把数组分为两个基本等长的子数组,分别排好序之后还要进行归并(Merge)操作,而快速排序拆分子数组的时候显得更有艺术,取一个基准元素,拆分之后基准元素左边的元素都比基准元素小,右边的元素都不小于基准元素,这样只需要分别对两个子数组排序即可,不再像归并排序一样需要归并操作.基准元素的选取对算法的效率影响很大,最好的情况是两个子数

Java常用排序算法及性能测试集合_java

现在再回过头理解,结合自己的体会, 选用最佳的方式描述这些算法,以方便理解它们的工作原理和程序设计技巧.本文适合做java面试准备的材料阅读. 先附上一个测试报告: Array length: 20000bubbleSort : 766 msbubbleSortAdvanced : 662 msbubbleSortAdvanced2 : 647 msselectSort : 252 msinsertSort : 218 msinsertSortAdvanced : 127 msinsertSor

C++实现自顶向下的归并排序算法_C 语言

本文实例讲述了C++实现自顶向下的归并排序算法.分享给大家供大家参考,具体如下: 一. 算法描述 自顶向下的归并排序:采用分治法进行自顶向下的程序设计方式,分治法的核心思想就是分解.求解.合并. 1. 先将长度为N的无序序列分割平均分割为两段 2. 然后分别对前半段进行归并排序.后半段进行归并排序 3. 最后再将排序好的前半段和后半段归并 过程(2)中进行递归求解,最终下图详细的分解了自顶向下的合并算法的实现过程: 二. 算法实现 /*==============================

C++实现自底向上的归并排序算法_C 语言

本文实例讲述了C++实现自底向上的归并排序算法.分享给大家供大家参考,具体如下: 一. 算法描述 自底向上的归并排序:归并排序主要是完成将若干个有序子序列合并成一个完整的有序子序列:自底向上的排序是归并排序的一种实现方式,将一个无序的N长数组切个成N个有序子序列,然后再两两合并,然后再将合并后的N/2(或者N/2 + 1)个子序列继续进行两两合并,以此类推得到一个完整的有序数组.下图详细的分解了自底向上的合并算法的实现过程: 二. 算法实现 /*=========================

使用java实现LIS算法,出操队形的问题_java

假设有序列:2,1,3,5,求一个最长上升子序列就是2,3,5或者1,3,5,长度都为3. LIS算法的思想是: 设存在序列a. ① 如果只有一个元素,那么最长上升子序列的长度为1: ② 如果有两个元素,那么如果a[1]>a[0],则最长上升子序列的长度为2,a[1]为该最长上升子序列的最后一个元素;若a[1]<a[0],则最长上升子序列的长度为1,a[0]和a[1]均为  其最长上升子序列的最后一个元素. ③ 如果由三个元素,那么如果a[2]>a[0],a[2]>a[1],则a[

java算法-java求教,算法竞赛入门经典 3.4 最长回文子串

问题描述 java求教,算法竞赛入门经典 3.4 最长回文子串 java新手求教,关键是怎么保存s[i]在buf中的位置,谢谢 解决方案 string longestPalindromeDP(string s) { int n = s.length(); int longestBegin = 0; int maxLen = 1; bool table[1000][1000] = {false}; for (int i = 0; i < n; i++) { table[i][i] = true;