归并排序java实现

1.归并排序

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

    b.实现:MergeSortMain

package cn.xiaobo.MergeSort;html

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

/**
 * 归并排序最差的状况下,比较次数为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]);
        }
    }
}
sql

c.MergeSortApp

package cn.xiaobo.MergeSort;数组

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

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);
        }
    }
}
spa

相关文章
相关标签/搜索