【第22期】观点:IT 行业加班,到底有没有价值?

归并排序 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( "]");
      }

}











版权声明: 举报

相关文章推荐

归并排序(MergeSort)的原理及延伸性思考

转自:http://blog.csdn.net/hawksoft/article/details/6765268       前面一篇博文写了归并排序的算法实现,虽然做了些注释,但没有写归并排...

排序算法:Insertion Sort和Merge Sort in GoLang

最近在学习算法导论,课程上讲了两种排序算法,分别是插入排序法和合并选择法 下面用GO语言实现 package sort //InsertionSort 插入排序 n^2 func Inserti...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

Insertion sort, select sort, Quick sort and Merge sort

冒泡排序 插入排序 选择排序 快速排序

插入排序算法(Insertion Sort)的两种实现

插入排序算法的两种实现。

排序算法之插入排序<Insertion_Sort>及其C语言代码实现

概述 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出一个元素插入到已排好的序列中。它的算法步骤可以大致归纳如下: 1. 从未排好的序列中选出一个元素,并把它赋值给temp变量...

归并排序(mergesort)

归并排序在最坏的情形下运行时间复杂度为O(N logN),是递归算法很好的一个实例。 其基本思想是合并两个已排序的表。因为这两个表是已排序的,所以若将输出放到第三个表中时则该算法可以通过对输入数据一...

归并排序(MergeSort)的原理及延伸性思考

前面一篇博文写了归并排序的算法实现,虽然做了些注释,但没有写归并排序的原理,这篇就补上,同时对归并所隐含的思想做一个探讨。 1)归并排序的原理      为了便于说明,这里我们提到的已排好序的序列...

归并排序(MergeSort)

和分治思想的第一次相遇 当问题的规模是可以划分的时候,分治的算法往往是很有效的: 不断分割问题的规模,直到子问题的规模足够小便直接求解,之后不断整合子问题的解得到更大规模的解,最后得到完全解。 归并排...

插入排序(insert_sort)与 并归排序(merge_sort) 算法分析

(一)插入排序 算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序...

bubbleSort, InsertionSort, mergeSort, heapSort实现

今天一口气将这四个排序算法都实现了下,个人觉得代码完成度还不错。 有空再把radixSort写完 #include void swap(int* a, int* b) { *a = *a^*...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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