集册 Java实例教程 使用合并排序对数组排序。

使用合并排序对数组排序。

欢马劈雪     最近更新时间:2020-01-02 10:19:05

500
提示:您可在线编辑运行本教程的实例 - 运行实例,去试试!
使用合并排序对数组排序。

import java.security.SecureRandom;

import java.util.Arrays;

/**
时 代 J a v a 公 众 号 - N o w J a v  a . c o m
**/

public class Main

{

   // calls recursive split method to begin merge sorting

   public static void mergeSort(int[] data)

   {

      sortArray(data, 0, data.length - 1); // sort entire array

   } 


   // splits array, sorts subarrays and merges subarrays into sorted array

   private static void sortArray(int[] data, int low, int high) /** from 时代Java公众号 - nowjava.com**/

   {

      // test base case; size of array equals 1     

      if ((high - low) >= 1) // if not base case

      {

         int middle1 = (low + high) / 2; // calculate middle of array

         int middle2 = middle1 + 1; // calculate next element over     


         // output split step

         System.out.printf("split:   %s%n", subarrayString(data, low, high));

         System.out.printf("         %s%n", subarrayString(data, low, middle1));

         System.out.printf("         %s%n%n",subarrayString(data, middle2, high));


         // split array in half; sort each half (recursive calls)

         sortArray(data, low, middle1); // first half of array       

         sortArray(data, middle2, high); // second half of array     


         // merge two sorted arrays after split calls return

         merge (data, low, middle1, middle2, high);             

      }                                           

   } 

   

   // merge two sorted subarrays into one sorted subarray             

   private static void merge(int[] data, int left, int middle1, int middle2, int right){

      int leftIndex = left; // index into left subarray              

      int rightIndex = middle2; // index into right subarray         

      int combinedIndex = left; // index into temporary working array

      int[] combined = new int[data.length]; // working array        

      

      // output two subarrays before merging

      System.out.printf("merge:   %s%n", subarrayString(data, left, middle1));

      System.out.printf("         %s%n", subarrayString(data, middle2, right));


      // merge arrays until reaching end of either         

      while (leftIndex <= middle1 && rightIndex <= right)

      {

         // place smaller of two current elements into result  

         // and move to next space in arrays                   

         if (data[leftIndex] <= data[rightIndex])        

            combined[combinedIndex++] = data[leftIndex++]; 

         else                                                  

            combined[combinedIndex++] = data[rightIndex++];

      } 

   

      // if left array is empty                                

      if (leftIndex == middle2)                              

         // copy in rest of right array                        

         while (rightIndex <= right)                         

            combined[combinedIndex++] = data[rightIndex++];

      else // right array is empty                             

         // copy in rest of left array                         

         while (leftIndex <= middle1)                        

            combined[combinedIndex++] = data[leftIndex++]; 


      // copy values back into original array

      for (int i = left; i <= right; i++)  

         data[i] = combined[i];          


      // output merged array

      System.out.printf("         %s%n%n", 

         subarrayString(data, left, right));

   } 


   // method to output certain values in array

   private static String subarrayString(int[] data, int low, int high)

   {

      StringBuilder temporary = new StringBuilder();

      // output spaces for alignment

      for (int i = 0; i < low; i++)

         temporary.append("   ");


      // output elements left in array

      for (int i = low; i <= high; i++)

         temporary.appen
展开阅读全文