日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【算法知识】详解归并排序算法

發(fā)布時間:2025/3/8 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法知识】详解归并排序算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

已發(fā)布:

【算法知識】詳解選擇冒泡算法

【算法知識】詳解選擇排序算法

【算法知識】詳解插入排序算法

【算法知識】詳解快速排序算法

基本思想

歸并排序的基本思想是:
先將序列一次次分成子序列,直到子序列長度為1;
再將已有序的子序列合并,得到完全有序的序列。
可以看出歸并排序運用了 分而治之的思想 。

例子

輸入數(shù)組 [ 2, 5, 3 , 10, ?-3, ?1 , 6 , 4];
初始狀態(tài)如下:

初始狀態(tài)

分治思想如下:
首先把數(shù)組依次折半,分成小的子數(shù)組,直到每一個子數(shù)組的長度都為1;
然后合并子數(shù)組,在合并的過程中進(jìn)行排序;
如下圖:

分治

將數(shù)組分成子數(shù)組的方法比較簡單,不過多介紹;
下面介紹一下合并操作,以最后一次合并為例:
下圖是最后一次合并前的兩個數(shù)組:

最后一次合并的兩個數(shù)組

定義兩個變量 leftright,分別賦值為兩個數(shù)組的首元素的索引;
初始化一個數(shù)組,數(shù)組長度為原數(shù)組大小;
再定義一個變量,t,初始化為新開的數(shù)組的第一個元素的索引,即0;
如下圖:

狀態(tài)1

然后每次從兩個數(shù)組中找相對較小的數(shù),填到新開的數(shù)組中;

-3 < 2,將-3填到數(shù)組中,right++;

狀態(tài)2

t++;

狀態(tài)3

1< 2,將1填到數(shù)組中,right++;

狀態(tài)4

t++;

狀態(tài)5

2 < 4,將2填到數(shù)組中,left++;

狀態(tài)6

t++

狀態(tài)7

3 < 4,將3填到數(shù)組中,left++;

狀態(tài)8

t++

狀態(tài)9

4 < 5,將4填到數(shù)組中,right++;

狀態(tài)10

t++

狀態(tài)11

5 < 6,將5填到數(shù)組中,left++;

狀態(tài)12

t++

狀態(tài)13

6 < 10,將6填到數(shù)組中right++后越界

狀態(tài)14

t++

狀態(tài)15

再把剩余的數(shù)加到數(shù)組里,直到子數(shù)組中的數(shù)都填過來;

狀態(tài)16

動圖如下:

動態(tài)圖

代碼

注意:
代碼中的right和例子中的right含義不同;
具體含義見代碼參數(shù)注釋。
先來看合并子數(shù)組的代碼;
函數(shù)聲明如下:

????//合并的方法/****?@param?arr?待排序的數(shù)組*?@param?left?左邊序列的初始索引*?@param?mid 中間索引(用來判斷左邊序列何時結(jié)束:到mid結(jié)束,右邊序列何時開始,即mid+1)*?@param?right?右邊數(shù)組結(jié)束的索引*?@param?temp?臨時存儲的數(shù)組*/ public?static?void?merge(int[]?arr,?int?left,?int?mid,?int?right,?int[]?temp){}

然后是合并的方法

public?static?void?merge(int[]?arr,?int?left,?int?mid,?int?right,?int[]?temp)?{//左邊有序序列的初始索引int?i?=?left;?//右邊有序序列的初始索引int?j?=?mid?+?1;?int?t?=?0;?//?指向臨時數(shù)組的當(dāng)前索引//將兩邊數(shù)組的元素進(jìn)行比較,依次填進(jìn)臨時數(shù)組//直到將一邊填完while?(i?<=?mid?&&?j?<=?right)?{//選擇較小的添加進(jìn)去if(arr[i]?<=?arr[j])?{temp[t]?=?arr[i];t?+=?1;i?+=?1;}?else?{?temp[t]?=?arr[j];t?+=?1;j?+=?1;}}//把有剩余數(shù)據(jù)的數(shù)組全部填充到數(shù)組//肉眼可以判別哪個有數(shù)據(jù),但是計算機需要用循環(huán)條件判別//所以有兩個while循環(huán)while(?i?<=?mid)?{temp[t]?=?arr[i];t?+=?1;i?+=?1;}while(?j?<=?right)?{?temp[t]?=?arr[j];t?+=?1;j?+=?1;}//將temp數(shù)組的元素拷貝到arrt?=?0;int?Left?=?left;?while(Left?<=?right)?{arr[Left]?=?temp[t];t?+=?1;Left?+=?1;}}

歸并代碼:

?//歸并(分+治)方法public?static?void?mergeSort(int[]?arr,?int?left,?int?right,?int[]?temp)?{if(left?<?right)?{int?mid?=?(left?+?right)?/?2;?//中間索引//左邊遞歸分解mergeSort(arr,?left,?mid,?temp);//右邊遞歸分解mergeSort(arr,?mid?+?1,?right,?temp);//合并merge(arr,?left,?mid,?right,?temp);}}

全代碼

import?java.util.Arrays;public?class?Solution?{public?static?void?main(String[]?args)?{int?[]arr=?new?int[]{2,5,3,10,-3,1,6,4};int?[]temp?=?new?int[arr.length];mergeSort(arr,0,arr.length-1,temp);System.out.println(Arrays.toString(arr));}//歸并(分+治)方法public?static?void?mergeSort(int[]?arr,?int?left,?int?right,?int[]?temp)?{if(left?<?right)?{int?mid?=?(left?+?right)?/?2;?//中間索引//左邊遞歸分解mergeSort(arr,?left,?mid,?temp);//右邊遞歸分解mergeSort(arr,?mid?+?1,?right,?temp);//合并merge(arr,?left,?mid,?right,?temp);}}//合并的方法/****?@param?arr?排序的原始數(shù)組*?@param?left?左邊有序序列的初始索引*?@param?mid?中間索引*?@param?right?右邊索引*?@param?temp?做中轉(zhuǎn)的數(shù)組*/public?static?void?merge(int[]?arr,?int?left,?int?mid,?int?right,?int[]?temp)?{//左邊有序序列的初始索引int?i?=?left;//右邊有序序列的初始索引int?j?=?mid?+?1;int?t?=?0;?//?指向臨時數(shù)組的當(dāng)前索引//將兩邊數(shù)組的元素進(jìn)行比較,依次填進(jìn)臨時數(shù)組//直到將一邊填完while?(i?<=?mid?&&?j?<=?right)?{//選擇較小的添加進(jìn)去if(arr[i]?<=?arr[j])?{temp[t]?=?arr[i];t?+=?1;i?+=?1;}?else?{temp[t]?=?arr[j];t?+=?1;j?+=?1;}}//把有剩余數(shù)據(jù)的數(shù)組全部填充到數(shù)組//肉眼可以判別哪個有數(shù)據(jù),但是計算機需要用循環(huán)條件判別//所以有兩個while循環(huán)while(?i?<=?mid)?{temp[t]?=?arr[i];t?+=?1;i?+=?1;}while(?j?<=?right)?{temp[t]?=?arr[j];t?+=?1;j?+=?1;}//將temp數(shù)組的元素拷貝到arrt?=?0;int?Left?=?left;while(Left?<=?right)?{arr[Left]?=?temp[t];t?+=?1;Left?+=?1;}} }

時間復(fù)雜度

歸并排序的是按照分層進(jìn)行比較的,會分成層;
而每一層的比較次數(shù)為;
所以時間復(fù)雜度求得。

穩(wěn)定性

在交換元素時,可以限定元素相等時不移動,所以歸并排序是可以穩(wěn)定的。

往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習(xí)在線手冊深度學(xué)習(xí)在線手冊AI基礎(chǔ)下載(pdf更新到25集)本站qq群1003271085,加入微信群請回復(fù)“加群”獲取一折本站知識星球優(yōu)惠券,復(fù)制鏈接直接打開:https://t.zsxq.com/yFQV7am喜歡文章,點個在看

總結(jié)

以上是生活随笔為你收集整理的【算法知识】详解归并排序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。