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

来源:互联网 发布:淘宝直播招聘主播吗 编辑:程序博客网 时间:2024/06/04 18:57

归并排序的时间复杂度为: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);//显示排序好的数据   }}
原创粉丝点击