Java經(jīng)典排序算法之歸并排序?qū)崿F(xiàn)代碼
1.簡介
歸并排序(MERGESORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應(yīng)用。
將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。
歸并排序的時間復(fù)雜度是O(nlogn), 空間復(fù)雜度是O(n)。是穩(wěn)定的排序。
歸并排序的思路流程是:
- 第一步、將待排序數(shù)列中的數(shù)字分為若干組,每個數(shù)字分成一組,即如果數(shù)列中8個數(shù)字,就分成8組。
- 第二步、將這些組兩兩合并,保證合并之后的數(shù)列是有序的。
- 第三步、重復(fù)第二步操作,直到只剩下一組,即排序完成。
看文字理解可能有點云里霧里,接下來我們用圖來解釋下這個過程。
2.圖解步驟
3.代碼實現(xiàn)
import java.util.Arrays; public class MergeSort { public static void main(String[] args) { int[] arr = {2,3,4,1,5,7,8,6}; System.out.println(Arrays.toString(arr)); mergeSort(arr,0, arr.length-1); System.out.println(Arrays.toString(arr)); } /** * * @param arr //待排序數(shù)組 * @param low //左邊標(biāo)識 * @param high //右邊標(biāo)識 */ public static void mergeSort(int[] arr,int low,int high){ if(low >= high){ return; } int mid = (low +high) >>> 1; mergeSort(arr,low,mid); mergeSort(arr,mid+1,high); //合并 merge(arr, low, mid, high); } private static void merge(int[] arr, int low, int mid, int high) { int s1 = low; //第一個歸并段開始 int s2 = mid+1 ;//第二個歸并段開始 //臨時數(shù)組 int[] ret = new int[high-low +1]; int i = 0; //ret數(shù)組的下標(biāo) //歸并段有數(shù)據(jù) while (s1 <= mid && s2 <=high ) { //s1和s2數(shù)據(jù)比較 if(arr[s1] <= arr[s2]){ ret[i++] = arr[s1++]; }else { ret[i++] = arr[s2++]; } } //跳出循環(huán) while (s1 <= mid){ ret[i++] = arr[s1++]; } while (s2 <= high){ ret[i++] = arr[s2++]; } for (int j = 0; j < ret.length ; j++) { arr[j+low]= ret[j]; } } }
到此這篇關(guān)于Java經(jīng)典排序算法之歸并排序?qū)崿F(xiàn)代碼的文章就介紹到這了,更多相關(guān)Java歸并排序?qū)崿F(xiàn)代碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis-spring:@MapperScan注解的使用
這篇文章主要介紹了mybatis-spring:@MapperScan注解的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Java Lombok簡介、使用、工作原理、優(yōu)缺點
這篇文章主要介紹了Java Lombok簡介、使用、工作原理、優(yōu)缺點的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java Lombok,感興趣的朋友可以了解下2021-03-03Mabatis錯誤提示Parameter index out of range的處理方法
這篇文章主要介紹了Mabatis錯誤提示Parameter index out of range 的處理方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08Java自定義異常_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Java自定義異常_動力節(jié)點Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下2017-04-04Java多線程的調(diào)度_動力節(jié)點Java學(xué)院整理
有多個線程,如何控制它們執(zhí)行的先后次序呢?下文給大家分享四種方法及java多線程調(diào)度的實例代碼,需要的朋友參考下吧2017-05-05淺談Java關(guān)閉線程池shutdown和shutdownNow的區(qū)別
本文主要介紹了Java關(guān)閉線程池shutdown和shutdownNow的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09