排序演算法之歸併排序__排序演算法-歸併排序

來源:互聯網
上載者:User

歸併排序演算法是分治思想的典型應用,下面具體闡述該演算法。 演算法描述

歸併排序演算法是建立在歸併操作上的一種有效排序演算法,整體思路就是對於一個需要排序的數組A[0…n-1],歸併排序首先將它一分為二:A[0…,(n/2)-1]和A[n/2…,n-1],然後對每個子數組進行遞迴排序,最後將兩個排序好的子數組合并為一個有序數組。 演算法分析

演算法時間複雜度分析:
最好情況:O(nlogn);
最壞情況:O(nlogn);
平均情況:O(nlogn); 演算法Java代碼實現

import java.util.*;public class MergeSort {    public int[] mergeSort(int[] A, int n) {        // 對數組進行邊界條件判定        if(A==null||A.length==0){            return null;        }        sort(A,0,n-1);        return A;        }    //遞迴排序階段    public void sort(int[] data,int left,int right){        //將數組拆分為兩部分,排序合并        if(left<right){                        int middle = (left+right)/2;            sort(data,left,middle);            sort(data,middle+1,right);            merge(data,left,middle,right);        }    }    //兩個有序數組A,B的合并演算法    public void merge(int[] data,int left,int middle,int right){        //定義一個臨時數組,用於後期存放兩個待合并數組合并後的結果        int[] temp = new int[right-left+1];        //待合并數組A的指標,指向第一個元素        int leftIndex = left;        //待合并數組B的指標,指向第一個元素        int rightIndex = middle+1;        //臨時數組的指標        int tempIndex = 0;        //迴圈比較兩個數組中元素的大小,並按照排序存放到臨時數組中去        while(leftIndex<=middle&&rightIndex<=right){            //依次比較兩個數組中各個元素的大小,將較小的放入臨時數組,            if(data[leftIndex]<=data[rightIndex]){                 temp[tempIndex++] = data[leftIndex++];            }else{                temp[tempIndex++] = data[rightIndex++];            }        }      //當一個數組中元素全部比較完成時,根據指標判斷另一個數組中是否還有未比較的元素,如果有,按照順序全部存放到臨時數組的已有元素的後面        while(leftIndex<=middle){            temp[tempIndex++] = data[leftIndex++];        }        //當一個數組中元素全部比較完成時,根據指標判斷另一個數組中是否還有未比較的元素,如果有,按照順序全部存放到臨時數組的已有元素的後面         while(rightIndex<=right){            temp[tempIndex++] = data[rightIndex++];        }        int temp1 = 0;        //將臨時數組中的元素按照順序依次拷貝到原數組中去,完成一個合并排序        while((temp1+left)<=right){            data[temp1+left] = temp[temp1++];        }    }}

merge方法分析:初始狀態下,定義兩個指標(待合并排序數組下標)分別指向兩個待合并數組的第一個元素,然後比較這兩個元素的大小,將較小的元素添加到新建立的臨時數組中去;接著,被複製數組中的指標向後移動一位,指向較小的元素的後繼元素,繼續上述比較過程,直至其中一個資料被處理完為止。然後,在未處理完的數組中,剩下的元素被複製到臨時數組的尾部,從而完成整個合并過程。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.