递归:归并排序(Java实现)

递归:归并排序(Java实现)_第1张图片

算法思路:

将待排序的数据先一分为二,接着再将者两部分合并,合并到一个备用数组中,合并的时候对比两边数据当前的值的大小,再选择一个加入到排好序的数组中,最后将备用数组的值复制回原数组。

算法如下:

Void MergeSort(int a[], int left, int right)
{
	if(left

代码如下:

package mergeSort;
import java.util.Scanner;

public class MergeSort {

	public static void main(String[] args) {
		System.out.println("请输入你需要进行排列的数据:");
		Scanner in = new Scanner(System.in);
		String str =in.nextLine();		//读取一行数据
		
		String arr[] = str.split(" ");	//拆分字符串成字符串数组
		int a[] = new int[arr.length];	//创建数组
		for(int j = 0; j < a.length; j++)	
		{
			a[j] = Integer.parseInt(arr[j]);	//将字符转化为数字
		}
		mergeSort(a,0,a.length-1);	//调用排序函数
		
		for(int j = 0; j < a.length; j++)	//输出排序后的结果
		{
			System.out.print(a[j]+" ");
		}
	}
	/*
	 * 合并排序函数
	 * 下标为left和right的元素都是要加入考量的值
	 */
	public static void mergeSort(int[] a,int left, int right){	
		if(lefti,包括i都是左边负责
			mergeSort(a,i+1,right);		//右边的进行合并排序,即i+1->right,包括right都是右边负责排序
			int b[] = new int[right-left+1];
			merge(a,b,left,i,right);		//将排好序的a的left到right这一段合并到b中
			copy(a,b,left,right);		//将b覆盖回a的left到right中
		}
	}
	/*
	 * 合并函数
	 * 按值的大小进行合并
	 */
	public static void merge(int a[],int b[],int left,int temp,int right){
		int i=left;	//左边一段数据的游标
		int j=temp+1;	//右边一段数据的游标
		int k=0;	//b当前指向游标
		while(i<=temp&&j<=right){	//在i还未到temp且j还未到right时的判断情况
			if(a[i]<=a[j]){	//i所指向数据小于或等于j所指向数据
				b[k]=a[i];	//取a[i]的值放入b中
				k++;		//同时b游标后移一位
				i++;		//i也应该指向下一个元素
			}else{			//i所指向数据大于j所指向数据,取a[j]
				b[k]=a[j];
				k++;
				j++;
			}
		}
		while(i<=temp){	//经过上面的步骤i还未到temp时可以直接全部复制过去
			b[k]=a[i];	//取a[i]的值放入b中
			k++;		//同时b游标后移一位
			i++;		//i也应该指向下一个元素
		}
		while(j<=right){	//经过上面的步骤j还未到right时可以直接全部复制过去
			b[k]=a[j];
			k++;
			j++;
		}
	}
	/*
	 * 覆盖函数
	 * 将数组b覆盖回去a中
	 */
	public static void copy(int a[],int b[],int left,int right){
		for(int i=left,j =0;i<=right;i++,j++){
			a[i]=b[j];
		}
	}

}

程序运行结果:

递归:归并排序(Java实现)_第2张图片

你可能感兴趣的:(算法学习)