题目要求;输入一个数组,以空格间隔。要求用归并排序从小到大排序并输出。
java实现如下:
import java.util.Scanner;
public class MergeSort
{
/**
* 归并排序
*/
public static void main(String[] args)
{
Scanner str = new Scanner(System.in);
String[] strlist = str.nextLine().split(" ");//这里想获得字符串数组,从而获得输入数值的个数
int[] list = new int[strlist.length];//因为java中数组需要在使用前给定大小,大小从字符串数组获得
for (int i = 0; i < strlist.length; i++)
{
list[i] = Integer.parseInt(strlist[i]);
}
for (int i = 0; i < list.length; i++)
{
System.out.print(list[i] + " ");
}
System.out.println();
//bubbleSort(list);//调用函数对数组进行排序
//insertSort(list);
//selectSort(list);
mergeSort(list);
for (int e : list)
{
System.out.print(e + " ");
}
}
//归并排序,分为拆分和合并两个部分
public static void mergeSort(int[] list)
{
if (list.length > 1)
{
//前半部分
int[] firstHalf = new int[list.length / 2];
System.arraycopy(list, 0, firstHalf, 0, list.length / 2);//用空间换时间
mergeSort(firstHalf);
//后半部分
int[] secondHalf = new int[list.length - list.length / 2];
System.arraycopy(list, list.length / 2, secondHalf, 0, list.length - list.length / 2);
mergeSort(secondHalf);
//调用合并函数
merge(firstHalf, secondHalf, list);
}
}
//归并排序第二部分,合并
public static void merge(int[] list1, int[] list2, int[] list)
{
int current1 = 0, current2 = 0, current3 = 0;//用于计算函数输入的三个数组的下标
while (current1 < list1.length && current2 < list2.length)
{
if (list1[current1] < list2[current2])
{
list[current3++] = list1[current1++];
}
else
{
list[current3++] = list2[current2++];
}
}
while (current1 < list1.length)
{
list[current3++] = list1[current1++];
}
while (current2 < list2.length)
{
list[current3++] = list2[current2++];
}
}
}