歸併排序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

相關文章
相關標籤/搜索