标签:
对数组进行归并排序:——分治法
分治法思想:先将原问题,分解成几个可独立求解的子问题, 等子问题求解后, 用适当方法,将子问题的解合并成原问题的解;
通常,由于子问题与原问题有相同的类型,故可使用递归实现。
数组的归并排序:
实现:
package com.algothrim;
/*
* 归并排序的实现
*/
public class DivideAndConquer {
public void mergeSort(int[] A,int low,int high){
if(low<high){
int mid=(low+high)/2;
mergeSort(A,low,mid);
mergeSort(A,mid+1,high);
merge(A,low,mid,high);
}
}
public void merge(int[] A,int low,int mid,int high){
int[] B=new int[high-low+1]; //辅助数组
int p1=low;
int p2=mid+1;
int p3=0;
for(;p1<=mid && p2<=high;){
if(A[p2]<A[p1]) //哪个小就复制哪个——从小到大排序;
B[p3++]=A[p2++];
else
B[p3++]=A[p1++];
}
while(p1<=mid)
B[p3++]=A[p1++];
while(p2<=high)
B[p3++]=A[p2++];
//复制回原来数组
for(int i=low,j=0;i<=high && j<B.length;i++,j++)
A[i]=B[j];
}
public static void main(String[] args) {
DivideAndConquer divider=new DivideAndConquer();
int A[]={33,12,5,2,3,7,25,18,42,15,90};
System.out.print("排序前:");
for(int i=0;i<A.length;i++)
System.out.print(" "+A[i]);
System.out.println();
divider.mergeSort(A, 0, A.length-1);
System.out.print("排序后:");
for(int i=0;i<A.length;i++)
System.out.print(" "+A[i]);
}
}
标签:
原文地址:http://www.cnblogs.com/dan-cnblogs/p/4732590.html