溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

利用java如何實(shí)現(xiàn)一個(gè)歸并排序算法

發(fā)布時(shí)間:2020-11-11 15:37:09 來源:億速云 閱讀:147 作者:Leah 欄目:編程語言

本篇文章為大家展示了利用java如何實(shí)現(xiàn)一個(gè)歸并排序算法,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

java 算法之歸并排序詳解

一、思想

歸并排序:將一個(gè)數(shù)組排序,可以先(遞歸地)將它分成兩半部份分別排序,然后將結(jié)果歸并起來;  

二、概念

歸并:將兩個(gè)有序的數(shù)組歸并成一個(gè)更大的有序數(shù)組;  

三、特點(diǎn)

優(yōu)點(diǎn):能夠保證將任意長度為N的數(shù)組排序所需要的時(shí)間和NlogN成正比;

缺點(diǎn):需要額外的空間和N成正比; 

 四、實(shí)現(xiàn)方法

將兩個(gè)不同的有序數(shù)組歸并到第三個(gè)數(shù)組中;

先將前半部分排序,在將后半部分排序,然后在數(shù)組中移動(dòng)元素而不需要使用額外的空間; 

五、代碼

/** 
 * 歸并排序 
 *  
 * @author pengcx 
 *  
 */  
public class Merge extends Sort {  
  /** 歸并所需的輔助數(shù)組 */  
  private static Comparable[] aux;  
  
  public static void main(String[] args) {  
    String[] a = { "d", "a", "w", "b", "q" };  
    Merge.sort(a);  
    show(a);  
  }  
  
  public static void sort(Comparable[] a) {  
    aux = new Comparable[a.length];  
    sort(a, 0, a.length - 1);  
  }  
  
  /** 
  * 排序數(shù)組的a[lo]至a[hi]元素 
  *  
  * @param a 
  *      數(shù)組a 
  * @param lo 
  *      最小元素位置lo 
  * @param hi 
  *      最大元素位置hi 
  */  
  private static void sort(Comparable[] a, int lo, int hi) {  
    if (hi <= lo) {  
      return;  
    }  
  
    // 計(jì)算數(shù)組中間位置  
    int mid = lo + (hi - lo) / 2;  
    // 排序數(shù)組a左邊的元素  
    sort(a, lo, mid);  
    // 排序數(shù)組a右邊的元素  
    sort(a, mid + 1, hi);  
    // 合并數(shù)組a左邊和右邊的元素  
    merge(a, lo, mid, hi);  
  }  
  
  /** 
  * 將數(shù)組a的a[lo]至a[mid]的元素與a[mid]至a[hi]的元素合并 
  *  
  * @param a 
  *      合并的數(shù)組a 
  * @param lo 
  *      最小數(shù)組元素lo 
  * @param mid 
  *      中間元素位置mid 
  * @param hi 
  *      最大元素位置hi 
  */  
  public static void merge(Comparable[] a, int lo, int mid, int hi) {  
    int i = lo, j = mid + 1;  
  
    for (int k = lo; k <= hi; k++) {  
      aux[k] = a[k];  
    }  
  
    for (int k = lo; k <= hi; k++) {  
      // 如果左邊的元素用盡,取右邊的元素  
      if (i > mid) {  
        a[k] = aux[j++];  
      }  
      // 如果右邊的元素用盡,取左邊的元素  
      else if (j > hi) {  
        a[k] = aux[i++];  
      }  
      // 如果右半邊的當(dāng)前元素小于左半邊的當(dāng)前元素,取右半邊元素  
      else if (less(aux[j], aux[i])) {  
        a[k] = aux[j++];  
      }  
      // 如果右半邊的當(dāng)前元素大于等于左半邊的當(dāng)前元素,取左半邊元素  
      else {  
        a[k] = aux[i++];  
      }  
    }  
  }  
}  

上述內(nèi)容就是利用java如何實(shí)現(xiàn)一個(gè)歸并排序算法,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI