考试前写的最终版本~
合并排序的递归实现算法。
输入:先输入进行合并排序元素的个数,然后依次随机输入(或随机生成)每个数字。
输出:元素排序后的结果,数字之间不加任何标识符。
示例:输入:8 11 1 2 4 8 6 15 8,输出:1 2 4 6 8 8 11
package Test2;
import java.util.Scanner;
/*
* 递归~~归并排序
*/
public class MergeSort {
static void mergesort(int arr[],int left,int right){
if(left<right){ //数组中至少有两个元素
int mid=(right+left)/2;
mergesort(arr,left,mid); //这里是把数组分成两段,注意这里mid所在包含在第一段(跟二分查找的不同)
mergesort(arr,mid+1,right);
merge(arr,left,mid,right); //合并到数组arr2,并把数组arr2中元素复制到arr
}
}
private static void merge(int arr[],int left,int mid,int right) { //合并 arr[left:m]和arr[mid+1:right] 到 arr2[l:r]
int i=left; // i是第一段序列的下标
int j=mid+1; // j是第二段序列的下标
int k=left; //k=left临时存放合并序列的下标
int arr2[]=new int[arr.length]; //创建一个和arr相等大小的数组
while ((i<=mid)&&(j<=right)) { // 判断第一段和第二段取出的数哪个更小,将其存入合并序列,并继续向下扫描
if(arr[i]<=arr[j]) arr2[k++]=arr[i++];
else arr2[k++]=arr[j++];
}
while(i<=mid) arr2[k++]=arr[i++]; //若第一段序列还没扫描完,将其全部复制到合并序列
while(j<=right) arr2[k++]=arr[j++]; // 若第二段序列还没扫描完,将其全部复制到合并序列
for(int s=left;s<=right;s++) // 将合并序列复制到原始序列中
arr[s]=arr2[s];
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n =s.nextInt();
int arr[]=new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i]=s.nextInt();
}
mergesort(arr,0,arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
}