您的位置:首页 > 编程语言 > Java开发

归并排序java实现

2017-12-13 00:00 239 查看

1.归并排序

a.原理: 是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。参考博客:https://www.cnblogs.com/chengxiao/p/6194356.html

b.实现:MergeSortMain

package cn.xiaobo.MergeSort;

import java.sql.Time;
import java.util.Timer;

/**
* 归并排序最差的情况下,比较次数为NlgN;比较次数在lgN和NlgN之间;
* @author Administrator
*
*/
public class MergeSortMain {

public static void main(String[] args) {
MergeSortApp mergeSortApp=new MergeSortApp();

int[] a=new int[11];
a[0]=12;
a[1]=23;
a[2]=1;
a[3]=78;
a[4]=22;
a[5]=9;
a[6]=8;
a[7]=7;
a[8]=6;
a[9]=45;
a[10]=67;
mergeSortApp.sort(a, 0, 10);
int i;
for(i=0;i<a.length;i++){
System.out.println("a数组"+i+"的数值为:"+a[i]);
}
}
}

c.MergeSortApp

package cn.xiaobo.MergeSort;

/**
* 对两个数组进行合并;
* @param a 要排序的数组
* @param first 起始位置
* @param last 终止位置

*/

public class MergeSortApp {
private void mergeArray(int[] a,int first,int last,int mid) {
int i=first,j=mid+1;
int n=last;
int m=mid;
int k=0;
int[] temp=new int[last-first+1];
//终止的条件是i小于k
while(i<=m&&j<=n){
//对划分为两边的数据进行对比,将较小的放到临时的数组中;
if(a[i]<=a[j]){
temp[k++]=a[i++];
}else{
temp[k++]=a[j++];
}
}
//如果因为对比,一组数据的全部进了temp,而另一组没有进入,
//则将剩下的数据放入到tmep中;
while(i<=m){
temp[k++]=a[i++];
}
while(j<=n){
temp[k++]=a[j++];
}
//将temp的值返回给a,这样a就是有序的了
//请注意记得temp的下标与a的下标,first的值不一定都是为0
//每次调用mergeArray都会创建一个temp数组;都是刚好能装合并后的元素的个数;
for(i=0;i<k;i++){
a[first+i]=temp[i];
}
}
/**
* 类似于二叉树的遍历,进行比较;
* @param a 要排序的数组
* @param first 起始位置
* @param last 终止位置

*/
public void sort(int[] a,int first,int last) {
//当划分到first==last时已经退出循环;最小单元是拥有两个数据的的数组
//然后有序了,两两比较,比较完后4 4比较;
if(first<last){
int mid=(first+last)/2;
//从小处开始进行排序;
sort(a, first,mid);
//从mid+1到last进行排序;
sort(a, mid+1,last);
mergeArray(a, first, last, mid);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: