www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > 架構(gòu)師社區(qū)
[導(dǎo)讀]下面介紹的大家就需要熟練掌握了,是面試高頻考點(diǎn),該文章分別用了遞歸法和迭代法實現(xiàn) 2 路歸并,希望對大家有一丟丟的幫助。

之前給大家介紹了幾個簡單排序,大家只需了解即可,下面介紹的大家就需要熟練掌握了,是面試高頻考點(diǎn),該文章分別用了遞歸法和迭代法實現(xiàn) 2 路歸并,希望對大家有一丟丟的幫助。

歸并排序 (Merge Sort)

歸并排序是必須要熟練掌握的排序算法,是面試高頻考點(diǎn),下面我們就一起來扒一扒歸并排序吧,原理很簡單,大家一下就能搞懂。

袁記菜館內(nèi)

第 23 屆食神爭霸賽開賽啦!

袁廚想在自己排名前4的分店中,挑選一個最優(yōu)秀的廚師來參加食神爭霸賽,選拔規(guī)則如下。

第一場 PK:每個分店選出兩名廚師,首先進(jìn)行店內(nèi) PK,選出店內(nèi)里的勝者

第二場 PK: 然后店內(nèi)的優(yōu)勝者代表分店挑戰(zhàn)其他某一分店的勝者(半決賽)

第三場 PK:最后剩下的兩名勝者進(jìn)行PK,選出最后的勝者。

示意圖如下

今天說的是必須要熟練掌握的歸并排序

廚神爭霸賽

上面的例子大家應(yīng)該不會陌生吧,其實我們歸并排序和食神選拔賽的流程是有些相似的,下面我們一起來看一下歸并排序吧。

歸并這個詞語的含義就是合并,并入的意思,而在我們的數(shù)據(jù)結(jié)構(gòu)中的定義是將兩個或兩個以上的有序表合成一個新的有序表。而我們這里說的歸并排序就是使用歸并的思想實現(xiàn)的排序方法。

歸并排序使用的就是分治思想。顧名思義就是分而治之,將一個大問題分解成若干個小的子問題來解決。小的子問題解決了,大問題也就解決了。分治后面會專門寫一篇文章進(jìn)行描述,這里先簡單提一下。

下面我們通過一個圖片來描述一下歸并排序的數(shù)據(jù)變換情況,見下圖。

今天說的是必須要熟練掌握的歸并排序

歸并排序

我們簡單了解了歸并排序的思想,從上面的描述中,我們可以知道算法的歸并過程是比較難實現(xiàn)的,這也是這個算法的重點(diǎn),我們先通過一個視頻來看一下歸并函數(shù)的具體步驟,看完我們這個視頻就能懂個大概啦。

視頻中歸并步驟大家有沒有看懂呀,沒看懂也不用著急,下面我們一起來拆解一下,歸并過程共分三步走。

第一步:創(chuàng)建一個額外大集合用于存儲歸并結(jié)果,長度則為那兩個小集合的和,從視頻中也可以看出

第二步:我們從左自右比較兩個指針指向的值,將較小的那個存入大集合中,存入之后指針移動,并繼續(xù)比較,直到某一小集合的元素全部都存到大集合中。見下圖

今天說的是必須要熟練掌握的歸并排序

合并

第三步:當(dāng)某一小集合元素全部放入大集合中,則需將另一小集合中剩余的所有元素存到大集合中,見下圖

今天說的是必須要熟練掌握的歸并排序

好啦,看完視頻和圖解是不是能夠?qū)懗鰝€大概啦,了解了算法原理之后代碼寫起來就很簡單啦,

下面我們看代碼吧。

注:這里用了System.arraycopy(),大家也可以使用其他方法,其中的五個參數(shù)分別是,源數(shù)組,目的數(shù)組,源數(shù)組起始索引,目的數(shù)組放置的起始索引,復(fù)制的長度

class Solution { public int[] sortArray(int[] nums) {
        mergeSort(nums,0,nums.length-1); return nums;
    } public void mergeSort(int[] arr, int left, int right) { if (left < right) { int mid = left + ((right - left) >> 1);
            mergeSort(arr,left,mid);
            mergeSort(arr,mid+1,right);
            merge(arr,left,mid,right);
        }
    } //歸并 public void merge(int[] arr,int left, int mid, int right) { //第一步,定義一個新的臨時數(shù)組 int[] temparr = new int[right -left + 1]; int temp1 = left, temp2 = mid + 1; int index = 0; //對應(yīng)第二步,比較每個指針指向的值,小的存入大集合 while (temp1 <= mid && temp2 <= right) { if (arr[temp1] <= arr[temp2]) { temparr[index++] = arr[temp1++]; } else {
                temparr[index++] = arr[temp2++];
            }
        } //對應(yīng)第三步,將某一小集合的剩余元素存到大集合中 if (temp1 <= mid) System.arraycopy(arr, temp1, temparr, index, mid - temp1 + 1); if (temp2 <= right) System.arraycopy(arr, temp2, temparr, index, right -temp2 + 1);    
        System.arraycopy(temparr,0,arr,left,right-left+1); 
    }
}

歸并排序時間復(fù)雜度分析

我們一趟歸并,需要將兩個小集合的長度放到大集合中,則需要將待排序序列中的所有記錄掃描一遍所以時間復(fù)雜度為O(n)。

歸并排序把集合一層一層的折半分組,則由完全二叉樹的深度可知,整個排序過程需要進(jìn)行 logn(向上取整)次,則總的時間復(fù)雜度為 O(nlogn)。

另外歸并排序的執(zhí)行效率與要排序的原始數(shù)組的有序程度無關(guān),所以在最好,最壞,平均情況下時間復(fù)雜度均為 O(nlogn) 。

雖然歸并排序時間復(fù)雜度很穩(wěn)定,但是他的應(yīng)用范圍卻不如快速排序廣泛,這是因為歸并排序不是原地排序算法,空間復(fù)雜度不為 O(1),那么他的空間復(fù)雜度為多少呢?

歸并排序的空間復(fù)雜度分析

歸并排序所創(chuàng)建的臨時結(jié)合都會在方法結(jié)束時釋放,單次歸并排序的最大空間是 n ,所以歸并排序的空間復(fù)雜度為 O(n).

歸并排序的穩(wěn)定性分析

歸并排序的穩(wěn)定性,要看我們的 merge 函數(shù),我們代碼中設(shè)置了 arr[temp1] <= arr[temp2] ,當(dāng)兩個元素相同時,先放入arr[temp1] 的值到大集合中,所以兩個相同元素的相對位置沒有發(fā)生改變,所以歸并排序是穩(wěn)定的排序算法。

今天說的是必須要熟練掌握的歸并排序

等等還沒完嘞,不要走呀。
歸并排序的 遞歸實現(xiàn)是比較常見的 ,也是比較容易理解的,下面我們一起來扒一下歸并排序的迭代寫法。看看他是怎么實現(xiàn)的。

我們通過一個視頻來了解下迭代方法的思想

是不是通過視頻了解個大概啦,下面我們來對視頻進(jìn)行解析。

迭代實現(xiàn)的歸并排序是將小集合合成大集合,小集合大小為 1,2,4,8,…..。依次迭代,見下圖

今天說的是必須要熟練掌握的歸并排序

比如此時小集合大小為 1 。兩個小集合分別為 [3],[1]。

然后我們根據(jù)合并規(guī)則,見第一個視頻,將[3],[1]合并到臨時數(shù)組中,則小的先進(jìn),進(jìn)而實現(xiàn)了排序,然后再將臨時數(shù)組的元素復(fù)制到原來數(shù)組中。則實現(xiàn)了一次合并。

下面則繼續(xù)合并[4],[6]。具體步驟一致。所有的小集合合并完成后,則小集合的大小變?yōu)?2,繼續(xù)執(zhí)行剛才步驟,見下圖。

今天說的是必須要熟練掌握的歸并排序

此時子集合的大小為 2 ,則為 [2,5],[1,3] 繼續(xù)按照上面的規(guī)則合并到臨時數(shù)組中完成排序。這就是迭代法的具體執(zhí)行過程,

下面我們直接看代碼吧。

注:遞歸法和迭代法的 merge 函數(shù)代碼一樣。

class Solution { public int[] sortArray (int[] nums) { //代表子集合大小,1,2,4,8,16..... int k = 1; int len = nums.length; while (k < len) { mergePass(nums,k,len); k *= 2;
        } return nums;

    } public void mergePass (int[] array, int k, int len) { int i; for (i = 0; i < len-2*k; i += 2*k) { //歸并 merge(array,i,i+k-1,i+2*k-1);
         } //歸并最后兩個序列 if (i + k < len) { merge(array,i,i+k-1,len-1);
         }

    } public void merge (int[] arr,int left, int mid, int right) { //第一步,定義一個新的臨時數(shù)組 int[] temparr = new int[right -left + 1]; int temp1 = left, temp2 = mid + 1; int index = 0; //對應(yīng)第二步,比較每個指針指向的值,小的存入大集合 while (temp1 <= mid && temp2 <= right) { if (arr[temp1] <= arr[temp2]) { temparr[index++] = arr[temp1++]; } else {
                temparr[index++] = arr[temp2++];
            }
        } //對應(yīng)第三步,將某一小集合的剩余元素存到大集合中 if (temp1 <= mid) System.arraycopy(arr, temp1, temparr, index, mid - temp1 + 1); if (temp2 <= right) System.arraycopy(arr, temp2, temparr, index, right -temp2 + 1); //將大集合的元素復(fù)制回原數(shù)組 System.arraycopy(temparr,0,arr,left,right-left+1); 
    }
}


通過上面的視頻解析和代碼,希望大家能夠?qū)w并排序給拿下,下面會給大家寫一下,歸并排序在實際刷題時的應(yīng)用,感謝閱讀。


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉