您的位置:首页 > 其它

MergeSort(递归)

2016-06-14 20:10 316 查看
考试前写的最终版本~

合并排序的递归实现算法。
输入:先输入进行合并排序元素的个数,然后依次随机输入(或随机生成)每个数字。
输出:元素排序后的结果,数字之间不加任何标识符。
示例:输入: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
;

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]);
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: