合并排序(Merge-sort)

来源:互联网 发布:淘宝助理顺丰模板下载 编辑:程序博客网 时间:2024/06/05 07:09
排序问题
输入:n个数(a1,a2,a3...)

输出:输入序列的一个重排列(a1',a2',a3'...),使得a1'>=a2'>=a3'....

合并排序算法基本过程:(1)假设存在两个有序的序列A、B(有序方向一致),那么将两个序列合成一个有序序列C(有序方向一致)的过程为,设定指标a、b、c分别为三个序列的指标,初始位置分别在各自序列头部,如果A[a]>B[b],则C[c]=A[a]并且a++、c++;否则C[c]=B[b],并且b++、c++;直到A、B其中某个序列达到尾部,然后将未到尾部序列的后面部分逐步复制给C;(2)一个序列只包含一个元素,设定为有序序列,且任意两个单元素序列的有序方向都是一致的;(3)将一串无序序列进行取半分解,在对已经取半的序列进行取半分解,则最终得到一系列的单元素序列,即得到一系列有序序列;(4)这一系列序列两临近进行第(1)步中的排序操作,直到合成一个完成的序列。

上述基本过程即对分治策略中的分解、解决、合并进行了简单的描述,亦递归过程的简要描述,实现代码如下:

import java.util.*;public class MergeSort {public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("请输入需要排序的一组数字并以空格隔开(5 8 9.。。):");Scanner myScanner = new Scanner(System.in);String tempStr = myScanner.nextLine();myScanner.close();String[] str = tempStr.split(" ");int[] myData = new int[str.length];int[] sortedData = new int[str.length];for(int i=0;i<str.length;i++){myData[i]=Integer.parseInt(str[i]);}MergeSort myMergeSort = new MergeSort();myMergeSort.mergesort(myData,0,myData.length-1,sortedData);for(int i=0;i<str.length;i++)System.out.print(sortedData[i]+" ");System.out.println();System.out.println("转换完成");}private void mergesort(int[] tempData,int startnum,int endnum,int[] sorted){if(startnum!=endnum){int mid=(startnum+endnum)/2;mergesort(tempData,startnum,mid,sorted);mergesort(tempData,mid+1,endnum,sorted);int i=startnum,j=mid+1,m=startnum;while((i<mid+1)&&(j<endnum+1)){if(tempData[i]>tempData[j]){sorted[m]=tempData[i];i++;m++;}else{sorted[m]=tempData[j];j++;m++;}}if((i==mid+1)&&(j!=endnum+1)){for(int n=j;n<endnum+1;n++,m++)sorted[m]=tempData[n];}else if((i!=mid+1)&&(j==endnum+1)){for(int n=i;n<mid+1;n++,m++)sorted[m]=tempData[n];}for(int n=startnum;n<=endnum;n++){tempData[n]=sorted[n];}}}}


0 0
原创粉丝点击