排序问题
输入:n个数(a1,a2,a3...)
输入: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 stub
System.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];
}
}
}
}