刚刚开始写博客,就先整理整理最近的练习情况吧。
摘抄个百度百科的释义:
归并排序:是将两个(或两个以上)的有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序的序列。
下面是我用Java来做的实现:
package com.jiangjiang.save.arithmetic;
import java.util.ArrayList;
import java.util.List;
/**
* 关于归并排序
* @author yanjiang
*
*/
public class Test1 {
public static void main(String[] args){
int[] A = {1,2,3,4};
int[] B = {3,4,5,6,7,8};
for(int i : merge(A,B)){
System.out.print(i+" ");
}
System.out.println();
int[] m = {4,2,12,5,8,10};
m = sort(m);
for(int i : m){
System.out.print(i+" ");
}
System.out.println();
}
/**
* 给定两个已经从小到大排序的整数数组A,B,将他们合并成一个新的从小到大排序的数组
* @param A
* @param B
* @return
*/
public static int[] merge(int[] A,int[] B){
//初始化一个新的数组存放合并后的结果
int[] C = new int[A.length+B.length];
//利用List存储两个数组中的数
List<Integer> a = new ArrayList<Integer>();
for(int i : A){
a.add(i);
}
List<Integer> b = new ArrayList<Integer>();
for(int i : B){
b.add(i);
}
//i为新数组的下标
int i = 0;
//直到a、b中取出所有数据
while(!(a.isEmpty() && b.isEmpty())){
if(a.isEmpty()){
//如果a先为空,则剩下的位置都由b中的数填满
C[i++] = b.remove(0);
continue;
}
if(b.isEmpty()){
//如果b先为空,同理
C[i++] = a.remove(0);
continue;
}
//比较过程,即将较小的数往前放
if(a.get(0)<b.get(0)){
C[i++] = a.remove(0);
}else{
C[i++] = b.remove(0);
}
}
//最后返回合并结果
return C;
}
/**
* 利用归并法对一个乱序数组排序
* @param nums
*/
public static int[] sort(int[] nums){
int mid = nums.length/2;//二路归并
if(mid == 0){
//如果数组中就剩一个数,直接返回
return nums;
}
//获取nums中左右两路的数
int[] A = new int[mid];
int[] B = new int[nums.length - mid];
for(int i = 0;i<A.length; i++){
A[i] = nums[i];
}
for(int i = 0;i<B.length; i++){
B[i] = nums[mid+i];
}
//再分别对左右两路数递归排序
A = sort(A);
B = sort(B);
//最后归并两路,并返回结果
return merge(A, B);
}
}
百科中说该算法是采用
分治法的一个典型应用。
关于分治法,下次再研究研究。