数据结构复习之–“2路归并排序”-JAVA实现

归并排序的时间复杂度为:O(nlogn)
和快速排序以及堆排序相比较,归并排序的最大特点是,它是一种稳定的排序方法。
一般的情况下很少利用2路归并排序进行内部排序。
尽管递归形式的2路归并算法在形式上较为简洁,但是实用性很差

Java 实现递归形式的二路归并算法如下,参考的严蔚敏的数据结构书中所写:

import java.util.Scanner;
public class MergeSortTest {
  /**
   * function:将inputData数组中连个相邻子序列进行归并,两个子序列分别有序 归并inputData[s..i] inputData[i+1..t]
   * @param inputData 待排序子序列
   * @param tempData  临时交换空间
   * @param s inputData中第一个子序列的开始位置 ,
   * @param i inputData第一个字序列的结束位置
   * @param t inputData第二个子序列的结束位置
   */
   private static void Merge(int[]inputData,int[] tempData,int s,int i, int t){
       int p,q,k;
       //将inputData[s--i]与inputData[i+1--t]中的元素逐个取出按大小放到tempData数组中的对应位置
       for(p=s,q=i+1,k=s;p<=i && q<=t;k++){
           if(inputData[p]<=inputData[q]) tempData[k]=inputData[p++];
           else tempData[k]=inputData[q++];
       }
       //将还未完全取出的子序列的元素放到tempData数组末尾
       if(p<=i) 
           while(p<=i && k<=t) 
               tempData[k++]=inputData[p++];
       if(q<=t) 
           while(q<=t && k<=t) 
               tempData[k++]=inputData[q++];
  }
   /**
    * function: 将inputData[s..t]归并为tempData[s..t]
    * @param inputData  待排序数据
    * @param tempData   存放排好序的数据
    * @param s          inputData开始排序位置
    * @param t          inputData结束排序位置
    */
   public static void MergeSort(int[] inputData, int []tempData, int s, int t){
        if(s==t) tempData[s]=inputData[s];
        else{
            int mid = (s+t)/2;                      //将inputData[s..t]平分为inputData[s..mid] inputData[mid+1..t]
            int[] temp = new int[inputData.length];
            MergeSort(inputData,temp,s,mid);           //递归地将inputData[s..mid]进行归并排序
            MergeSort(inputData,temp,mid+1,t);         //递归地将inputData[mid+1,t]进行归并排序
            Merge(temp,tempData,s,mid,t);          //将temp2[s..mid]和temp[mid+1..t]进行归并
          }
   }

   private static int[] getData(){
         //从控制台读入数据
         Scanner sc = new Scanner(System.in); 
         System.out.print("请输入待排序数据总数:");
         int totalNums = sc.nextInt();
         int [] array = new int[totalNums];
         System.out.print("请输入待排序数据,以空格作为分隔符:");
         for (int i = 0; i < totalNums; i++) {
             array[i]=sc.nextInt();
        }
         return array;
   }
   private static  void show(int[] array){
       for (int i = 0; i < array.length; i++) {
        System.out.print(array[i]+" ");
    }
   }
   public static void main(String[] args){


       int[] inputData=MergeSortTest.getData();//读取数据

       MergeSortTest.MergeSort(inputData,inputData,0,inputData.length-1);//2路归并排序

       MergeSortTest.show(inputData);//显示排序好的数据
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值