归并排序

归并排序采用了递归与分治策略,将数组先进行分解,分解为一个一个小的序列,当序列只包含一个元素时(此时小序列一定是有序的),递归地进行合并有序数列。

简而言之,先划分在合并。

比如:数据序列[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]+" ");
}
}
}

结果如下


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值