欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java 歸并排序的實例詳解

 更新時間:2017年07月14日 09:34:43   投稿:lqh  
這篇文章主要介紹了java 歸并排序的實例詳解的相關資料,需要的朋友可以參考下

java 歸并排序的實例詳解

歸并排序

       歸并排序,指的是將兩個已經排序的序列合并成一個序列的操作。 

歸并操作的過程如下:

  •  申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合并后的序列
  •  設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
  •  比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置
  •  重復步驟3直到某一指針到達序列尾
  •  將另一序列剩下的所有元素直接復制到合并序列尾

Java代碼 

/** 
 * 歸并排序 
 * 
 * @param ts 
 */ 
@SuppressWarnings("unchecked") 
public static <T extends Comparable<? super T>> void mergeSort(T[] ts) { 
 
  // 輔助空間 
  T[] tempArray = (T[]) new Comparable[ts.length]; 
 
  mergeSort(ts, tempArray, 0, ts.length - 1); 
} 
 
/** 
 * 遞歸 
 */ 
private static <T extends Comparable<? super T>> void mergeSort(T[] ts, T[] tempArray, int left, int right) { 
 
  if (left < right) { 
 
    int center = (left + right) / 2; 
 
    mergeSort(ts, tempArray, left, center); 
 
    mergeSort(ts, tempArray, center + 1, right); 
 
    // 左右合并 
    merge(ts, tempArray, left, center + 1, right); 
 
  } 
 
} 
 
/** 
 * 合并 
 */ 
private static <T extends Comparable<? super T>> void merge(T[] ts, T[] tempArray, int leftPos, int rightPos, int rightEnd) { 
  int leftEnd = rightPos - 1; 
  int temPos = leftPos; 
  int numElements = rightEnd - leftPos + 1; 
 
  while (leftPos <= leftEnd && rightPos <= rightEnd) 
    //比較放到輔助空間 
    if (ts[leftPos].compareTo(ts[rightPos]) <= 0) 
      tempArray[temPos++] = ts[leftPos++]; 
    else 
      tempArray[temPos++] = ts[rightPos++]; 
 
  while (leftPos <= leftEnd) 
    tempArray[temPos++] = ts[leftPos++]; 
 
  while (rightPos <= rightEnd) 
    tempArray[temPos++] = ts[rightPos++]; 
 
  //考回原數(shù)組,此處最好用System.arraycopy優(yōu)化 
  for (int i = 0; i < numElements; i++, rightEnd--) 
    ts[rightEnd] = tempArray[rightEnd]; 
} 
 

 復雜度:O(n log n)

       比較操作的次數(shù)介于(n log n)/2和n log n - n + 1。 賦值操作的次數(shù)是(2nlogn)。

       歸并算法的空間復雜度為:Θ(n) 

 穩(wěn)定性:穩(wěn)定 

擴展:

       在java中,當執(zhí)行一次泛型排序時,進行一次元比較可能是昂貴的,但是移動元素則是省時間的。歸并排序使用所有的流行的排序算法中最少的比較次數(shù),因此是使用java的通用排序算中的上好的選擇。

以上使用java 使用歸并排序的簡單實例,有關java算法知識本站還有很多,大家可以搜索,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • java面試常問的Runnable和Callable的區(qū)別

    java面試常問的Runnable和Callable的區(qū)別

    大家好,本篇文章主要講的是java面試常問的Runnable和Callable的區(qū)別,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 解決mybatis-plus自定義xml的坑

    解決mybatis-plus自定義xml的坑

    這篇文章主要介紹了解決mybatis-plus自定義xml的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Mybatis-Plus自動生成的數(shù)據(jù)庫id過長的解決

    Mybatis-Plus自動生成的數(shù)據(jù)庫id過長的解決

    這篇文章主要介紹了Mybatis-Plus自動生成的數(shù)據(jù)庫id過長的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java之MyBatis入門詳解

    Java之MyBatis入門詳解

    這篇文章主要介紹了Java之MyBatis入門詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 詳細分析Java內部類——局部內部類

    詳細分析Java內部類——局部內部類

    這篇文章主要介紹了Java局部內部類的相關資料,幫助大家更好的理解和學習Java 內部類的知識,感興趣的朋友可以了解下
    2020-08-08
  • 解決IDEA target文件夾越來越大的問題

    解決IDEA target文件夾越來越大的問題

    這篇文章主要介紹了解決IDEA target文件夾越來越大的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java集合ArrayList與LinkedList詳解

    Java集合ArrayList與LinkedList詳解

    這篇文章主要介紹了Java集合ArrayList與LinkedList詳解,對于ArrayList和LinkedList,他們都是List接口的一個實現(xiàn)類,并且我們知道他們的實現(xiàn)方式各不相同,例如ArrayList底層實現(xiàn)是一個數(shù)組
    2022-08-08
  • Springboot配置過濾器實現(xiàn)過程解析

    Springboot配置過濾器實現(xiàn)過程解析

    這篇文章主要介紹了Springboot配置過濾器實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 巧用FutureTask 線程池輕松解決接口超時問題

    巧用FutureTask 線程池輕松解決接口超時問題

    這篇文章主要為大家介紹了使用FutureTask結合線程池輕松解決接口超時問題的巧妙用法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 基于socket和javaFX簡單文件傳輸工具

    基于socket和javaFX簡單文件傳輸工具

    這篇文章主要介紹了基于socket和javaFX簡單文件傳輸工具的相關資料,需要的朋友可以參考下
    2016-02-02

最新評論