转载

Java中的合并排序算法

合并排序算法是一种分而治之的算法。在分而治之的范式中,一个问题被分解成较小的问题,其中每个小问题仍然保留着大问题的所有属性——大小除外。为了解决原始问题,每个部分都是单独解决的,然后这些部分又合并在一起。例如,假设您必须使用冒泡排序算法对200个元素的数组进行排序。因为选择排序需要O(n^2)时间,所以对数组进行排序大约需要40000个时间单位。现在想象一下,将数组拆分成十个相等的片段,并使用选择排序对每个片段进行单独排序。现在,每件物品的分类需要400个时间单位;总共10*400=4000。

一旦每一部分被分类,将它们重新合并将需要大约200个时间单位;总计200+4000=4200。显然,4200比40000是一个显著的进步。

现在想想更大点。设想将原始数组分成两组,然后对它们进行排序。最后,对数组进行排序大约需要1000个时间单位。

这就是合并排序的工作原理。它使大数组的排序变得容易,因此适用于大整数和字符串数组。合并排序算法的时间复杂度在最佳、平均和最差情况下是相同的,等于O(n*log(n))。

顺便说一下,如果你对算法和数据结构很陌生,不熟悉Quas排序、二进制搜索、级搜索等基本排序和搜索算法,那么我建议你通过一个好的、全面的在线课程,比如数据结构和算法:用Java深入学习基本知识。

使用合并排序算法对数组进行排序:

您已经给出了一个无序的整数列表(或任何其他对象,例如字符串),您必须按其自然顺序重新排列整数或对象。

Sample Input: {80, 50, 30, 10, 90, 60, 0, 70, 40, 20, 5}

Sample Output: {0, 10, 20, 30, 40, 50, 50, 60, 70, 80, 90}

<b>import</b> java.util.Arrays;

<font><i>/*
 * Java Program to sort an integer array using merge sort algorithm.
 */</i></font><font>

<b>public</b> <b>class</b> Main {

  <b>public</b> <b>static</b> <b>void</b> main(String args) {

    System.out.println(</font><font>"mergesort"</font><font>);
    <b>int</b> input = { 87, 57, 370, 110, 90, 610, 02, 710, 140, 203, 150 };

    System.out.println(</font><font>"array before sorting"</font><font>);
    System.out.println(Arrays.toString(input));

    </font><font><i>// sorting array using MergeSort algorithm</i></font><font>
    mergesort(input);

    System.out.println(</font><font>"array after sorting using mergesort algorithm"</font><font>);
    System.out.println(Arrays.toString(input));

  }

  </font><font><i>/**
   * Java function to sort given array using merge sort algorithm
   * 
   * @param input
   */</i></font><font>
  <b>public</b> <b>static</b> <b>void</b> mergesort(<b>int</b> input) {
    mergesort(input, 0, input.length - 1);
  }

  </font><font><i>/**
   * A Java method to implement MergeSort algorithm using recursion
   * 
   * @param input
   *          , integer array to be sorted
   * @param start
   *          index of first element in array
   * @param end
   *          index of last element in array
   */</i></font><font>
  <b>private</b> <b>static</b> <b>void</b> mergesort(<b>int</b> input, <b>int</b> start, <b>int</b> end) {

    </font><font><i>// break problem into smaller structurally identical problems</i></font><font>
    <b>int</b> mid = (start + end) / 2;
    <b>if</b> (start < end) {
      mergesort(input, start, mid);
      mergesort(input, mid + 1, end);
    }

    </font><font><i>// merge solved pieces to get solution to original problem</i></font><font>
    <b>int</b> i = 0, first = start, last = mid + 1;
    <b>int</b> tmp = <b>new</b> <b>int</b>[end - start + 1];

    <b>while</b> (first <= mid && last <= end) {
      tmp[i++] = input[first] < input[last] ? input[first++] : input[last++];
    }
    <b>while</b> (first <= mid) {
      tmp[i++] = input[first++];
    }
    <b>while</b> (last <= end) {
      tmp[i++] = input[last++];
    }
    i = 0;
    <b>while</b> (start <= end) {
      input[start++] = tmp[i++];
    }
  }
}

Output
mergesort
array before sorting
<p>[87, 57, 370, 110, 90, 610, 2, 710, 140, 203, 150]
array after sorting using mergesort algorithm
<p>[2, 57, 87, 90, 110, 140, 150, 203, 370, 610, 710]
</font>

您可以看到该数组现已排序。 我们使用的算法是合并排序的递归实现,它也是一个稳定的排序算法。

无论如何,如果你还没有得到合并排序算法的工作原理,你还可以查看算法和数据结构 - 关于Pluralsight的第1部分和第2部分课程,它以非常好的方式解释了键排序和搜索算法。 它还包括基本数据结构,如链表,数组,哈希表,二叉树等。

原文  https://www.jdon.com/51850
正文到此结束
Loading...