归并排序采用了递归与分治策略,将数组先进行分解,分解为一个一个小的序列,当序列只包含一个元素时(此时小序列一定是有序的),递归地进行合并有序数列。
简而言之,先划分在合并。
比如:数据序列[1,3,5,9,7,11,19,16,6]
划分子序列如下:
合并有序序列:比如两个有序序列进行合并时,只要比较两个序列的第一个元素,谁小就先取那个元素,然后删除这个元素,比较下一个。当两个序列中某一个序列的元素全部比较完时,依次将另一个序列的元素取出就好。
划分子序列的时间复杂度为O(logN),合并有序序列的时间复杂度为O(N),所以整个算法的时间复杂度为O(N*logN);
归并排序。编写一个程序,使用递归和分治策略实现二路归并排序。【输入:一个一维整型数组;输出:排序之后的一维整型数组】
package cn.aaa;import java.util.Scanner;
import javax.swing.text.DefaultEditorKit.CopyAction;
/*
*
* 归并排序
*/
public class MergeSort {
public static void MergeSort(int a[],int b[],int left,int right) { //分解数列
if(left<right){ //至少有两个元素,才进行排序
int mid = (left+right)/2; //取中点
MergeSort(a,b,left,mid);
MergeSort(a,b,mid+1,right);
Merge(a,b,left,mid,right);
}
}
public static void Merge(int a[],int b[],int left,int mid,int right) { //合并有序数列
int i =left,j=mid+1,k=left; //注意k值取值,如果k=0,则在后面的for语句中,k2=0,a[k2]应为a[first+k2]
while(i<=mid && j<=right){
if(a[i]<=a[j])
b[k++] = a[i++];
else
b[k++] = a[j++];
}
while(i<=mid) b[k++] = a[i++]; //合并左边
while(j<=right) b[k++] = a[j++]; //合并右边
for (int k2 = left; k2 < k; k2++) {
a[k2] = b[k2];
}
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入一串整数并在输入时用英文逗号隔开:");
String str = s.next().toString();
String stringArray[]=str.split(",");
int a[] = new int[stringArray.length];
int b[] = new int[a.length]; //临时变量数组,用来存储数组a排序之后的值
for (int i = 0; i < stringArray.length; i++) {
a[i] = Integer.parseInt(stringArray[i]);
}
MergeSort(a,b,0,a.length-1);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
}
}
结果如下
748

被折叠的 条评论
为什么被折叠?



