归并排序 Merge sort

原创 2013年12月04日 22:13:53
是一种简单的排序方法。时间复杂度为 O(N*logN)

思想:归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。

可以看出合并有序数列的效率是比较高的,可以达到O(n)

解决了上面的合并有序数列问题,再来看归并排序,基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?

可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(N*logN)。因为归并排序每次都是在相邻的数据中进行操作,所以归并排序在O(N*logN)的几种排序方法(快速排序,归并排序,希尔排序,堆排序)也是效率比较高的。

public class MergeSort {
      public static final int CUTOFF = 11;

      public static void main(String[] args) {
             // TODO Auto-generated method stub
             int[] a;
             int n = 300;
             // 生产随机数组
            a = new int[n];
            Random rand = new Random();
             for ( int i = 0; i < a. length; i++) {
                  a[i] = rand.nextInt(n);
            }
             //a = new int [] {33,10,80};
             println(a);

             long s = System. nanoTime();
             int[] b = mergeSort(a);
             long dur = System. nanoTime() - s;
             println(b);
            System. out.println(dur);

      }

      public static int[] mergeSort( int[] a) {
             int[] tmp = new int[a. length];
             split(a, tmp, 0, a.length-1);
             return tmp;
      }

      public static void split(int[] a, int[] tmp, int left, int right) {
             //System.out.println(left+","+right);
             if (left < right) {
                   int center = (left + right) / 2;
                   //System.out.println(center);
                   split(a, tmp, left, center);
                   split(a, tmp, center + 1, right);
                   merge(a,tmp,left,center+1,right);
            }
             //System.out.println("返回");
      }
    public static void merge(int[] a,int[] tmp,int lPos,int rPos,int rEnd){
      //System.out.println("merge:"+lPos+","+rPos+","+rEnd);
      int lEnd = rPos -1;
      int tPos = lPos;   
      int leftTmp = lPos;
      while(lPos <= lEnd && rPos <= rEnd){
             if(a[lPos] <= a[rPos]){
                  tmp[tPos++] = a[lPos++];
            } else{
                  tmp[tPos++] = a[rPos++];
            }           
      }
      
      while(lPos <= lEnd){
            tmp[tPos++] = a[lPos++];
      }
      
      while(rPos <= rEnd){
            tmp[tPos++] = a[rPos++];
      }
      // copy the tmpArr back cause we need to change the arr array items.
      for ( ; rEnd >= leftTmp; rEnd-- )
            a[rEnd] = tmp[rEnd];
      
    }

      public static void println(int[] a) {
            System. out.print( "[");
             for ( int i = 0; i < a. length; i++) {
                  System. out.print(a[i]);
                   if (i != a. length - 1)
                        System. out.print( ",");
            }
            System. out.println( "]");
      }

}











归并排序(merge sort)

归并排序,算法复杂度为O(nlogn),属于快速排序范畴。 算法简介 归并算法的思想是divide and conquer,分治法。将一个大的问题分解为若干的小问题,将小问题各个击破和,在对小问题...

Merge Sort归并排序

归并排序采用递归的思想对数组进行排序,

详细解说归并排序+逆序对(merge sort)

今天做了一道关于逆序对的题,才发现,sort用的太多,都不太记得如何写归并,所以稍微复习了一下,先说一下归并怎么用吧。 归并排序的解说:其实,仔细看一下,很容易理解归并排序主要思想,归并就是把多个表合...

算法基础3:归并排序(Merge Sort)

#include #include #define MAXSIZE 100void MergeSort(int a[], int n); void mergesort(int a[], int p...
  • Artprog
  • Artprog
  • 2017年03月16日 23:24
  • 309

Merge Sort(归并排序)

基本思路: 1.把数组一分为二,然后再不断将小数组递归一分为二下去,经过一些排序再将它们合并起来。 2.排序之前需要一个辅助数组,用于记录数据。第一步将原数组(左右分别有序)拷贝到辅助数组里。 ...
  • Ninja_Z
  • Ninja_Z
  • 2017年03月30日 20:25
  • 120

链表和归并排序(Merge Sort)

归并排序适合于对链表进行原址排序,即只改变指针的连接方式,不交换链表结点的内容。 归并排序的基本思想是分治法:先把一个链表分割成只有一个节点的链表,然后按照一定顺序、自底向上合并相邻的两个链表。 ...

算法之归并排序算法(merge sort)

归并排序算法 1.算法原理 归并排序算法是分治法(Divide-and-Conquer)的典型应用。其操作的步骤如下: Divide:把n个元素的序列分为两个元素个数为n/2的子序列。Con...

2路归并排序(MERGE_SORT)

简述: 我用的循环输入测试,输出Ctrl+z结束,输入随机产生数的个数,然后观察结果。 代码如下: #include #include #include void Merge_Sort(int ...
  • llwwlql
  • llwwlql
  • 2015年12月15日 20:17
  • 472

归并排序(Merge sort)

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:归并排序 Merge sort
举报原因:
原因补充:

(最多只允许输入30个字)