Java經(jīng)典排序算法之歸并排序?qū)崿F(xiàn)代碼
1.簡(jiǎn)介
歸并排序(MERGESORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用。
將已有序的子序列合并,得到完全有序的序列;即先使每個(gè)子序列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一個(gè)有序表,稱為二路歸并。
歸并排序的時(shí)間復(fù)雜度是O(nlogn), 空間復(fù)雜度是O(n)。是穩(wěn)定的排序。
歸并排序的思路流程是:
- 第一步、將待排序數(shù)列中的數(shù)字分為若干組,每個(gè)數(shù)字分成一組,即如果數(shù)列中8個(gè)數(shù)字,就分成8組。
- 第二步、將這些組兩兩合并,保證合并之后的數(shù)列是有序的。
- 第三步、重復(fù)第二步操作,直到只剩下一組,即排序完成。
看文字理解可能有點(diǎn)云里霧里,接下來(lái)我們用圖來(lái)解釋下這個(gè)過(guò)程。
2.圖解步驟


3.代碼實(shí)現(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)識(shí)
* @param high //右邊標(biāo)識(shí)
*/
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; //第一個(gè)歸并段開(kāi)始
int s2 = mid+1 ;//第二個(gè)歸并段開(kāi)始
//臨時(shí)數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中使用Redisson的實(shí)現(xiàn)示例
Redission是一個(gè)強(qiáng)大的Java庫(kù),用于構(gòu)建和管理分布式系統(tǒng)中的緩存和任務(wù)調(diào)度,本文主要介紹了SpringBoot中使用Redisson的實(shí)現(xiàn)示例,感興趣的可以了解一下2023-12-12
SpringBoot和Vue項(xiàng)目服務(wù)器發(fā)布流程分享
本文詳細(xì)介紹了如何將SpringBoot和Vue項(xiàng)目發(fā)布到阿里云ECS服務(wù)器上的步驟,包括準(zhǔn)備服務(wù)器、安裝寶塔、配置數(shù)據(jù)庫(kù)、打包項(xiàng)目、上傳文件、設(shè)置端口、安裝軟件和注冊(cè)網(wǎng)站等2025-02-02
Springboot通過(guò)谷歌Kaptcha?組件生成圖形驗(yàn)證碼功能
Kaptcha是谷歌開(kāi)源的一款簡(jiǎn)單實(shí)用的圖形驗(yàn)證碼組件。我個(gè)人推薦它的最大原因是容易上手,采用約定大于配置的方式,快速契合到項(xiàng)目中,這篇文章主要介紹了Springboot通過(guò)谷歌Kaptcha組件生成圖形驗(yàn)證碼的方法,需要的朋友可以參考下2023-05-05
Java 獲取原始請(qǐng)求域名實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Java 獲取原始請(qǐng)求域名實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
淺析fastjson2時(shí)間序列化和反序列化的簡(jiǎn)單使用
在項(xiàng)目中將fastjson升級(jí)為fastjson2后,我們遇到了一些與fastjson不完全兼容的問(wèn)題,所以本文就來(lái)探討下fastjson2的時(shí)間序列化和反序列化的簡(jiǎn)單使用吧2025-01-01
Spring Boot控制層參數(shù)綁定@RequestPart 注解的使用
@RequestPart是一個(gè)非常重要但常被忽略的注解,專門用于處理multipart/form-data請(qǐng)求中的復(fù)雜數(shù)據(jù)類型,下面給大家介紹Spring Boot控制層參數(shù)綁定@RequestPart 注解的使用,感興趣的朋友跟隨小編一起看看吧2026-02-02
Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例
這篇文章主要介紹了Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例,幫助大家更好的理解和學(xué)習(xí)使用Spring Cloud,感興趣的朋友可以了解下2021-03-03
Java結(jié)合redistemplate使用分布式鎖案例講解
在Java中使用RedisTemplate結(jié)合Redis來(lái)實(shí)現(xiàn)分布式鎖是一種常見(jiàn)的做法,特別適用于微服務(wù)架構(gòu)或多實(shí)例部署的應(yīng)用程序中,以確保數(shù)據(jù)的一致性和避免競(jìng)態(tài)條件,下面給大家分享使用Spring Boot和RedisTemplate實(shí)現(xiàn)分布式鎖的案例,感興趣的朋友一起看看吧2024-08-08

