前言:排序是現在程序員的必備技能煌抒,是很多公司的面試必考點元镀,不管是做移動端,后端開發(fā)欣簇,排序是繞不過的巾钉,眾生平等翘狱。學習其排序的思想往往能解決不同類型的問題,所以靜下心來砰苍,研究一下不同的排序算法潦匈,算是對自己有一個提升踏烙。
排序概述:排序就是將一組對象按照某種邏輯順序重新排列的過程。
十大排序算法:冒泡排序历等,選擇排序讨惩,插入排序,歸并排序寒屯,堆排序荐捻,快速排序,希爾排序寡夹,計數排序处面,基數排序,桶排序菩掏。
本文對歸并排序走一個解析:
歸并排序步驟:
1.歸并排序是建立在歸并操作上的一種有效的排序算法魂角。該算法是采用分治法的一個非常典型的應用。
2.對于給定一組數據智绸,利用遞歸與分治技術將數據序列劃分成為越來越小的半子表野揪,在對半子表排序后,再利用遞歸方法將排序好的半子表合并成為越來越大的有序序列瞧栗。
3.為了提升性能斯稳,有時候我們在半子表的個數小于某個數(比如15的情況下),對半子表的排序采用其他排序算法迹恐,比如插入排序挣惰。
4.若將兩個有序表合并成一個有序表,稱為2-路歸并殴边,與之對應的還有多路歸并憎茂。
代碼舉例:
對一個數組進行排序:(86,11,77,23,32,45,58,63,93,4,37,22)
int[] array = {86,11,77,23,32,45,58,63,93,4,37,22};
排序代碼展示:?
調用sort方法后打印如下:
?對該案例進行分析:(86,11,77,23,32,45,58,63,93,4,37,22)
? 進行第一次拆分 ?left : ?[86, 11, 77, 23, 32, 45]---拆分-->right: ? [58, 63, 93, 4, 37, 22]?
? 注:根據此處代碼執(zhí)行遞歸順序,每次都是先執(zhí)行完左邊子表锤岸,再進行右邊子表拆分竖幔,所以這里只分析大左子表,邏輯是一樣的
? 左邊大子表第一次拆分 :[86, 11, 77]---拆分-->[23, 32, 45]
? (1)對于:[86, 11, 77]
? ? ? ? ? ? ?[86]---拆分-->[11, 77]
? ? ? ? ? ? [11]---拆分-->[77]
? ? ? ? ? ? 執(zhí)行完merge以后:
? ? ? ? ? ? ? ? ? ? ?返回1:[11, 77]
? ? ? ? ? ? ? ? ? ? ?返回2:[11, 77, 86]
?(2)對于:[23, 32, 45]
? ? ? ? ? ? [23]---拆分-->[32, 45]
? ? ? ? ? ? [32]---拆分-->[45]?
? ? ? ? ? ?執(zhí)行完merge以后:
? ? ? ? ? ? ? ? ? ? ? 返回3:[32, 45]
? ? ? ? ? ? ? ? ? ? ? 返回4:[23能耻,32赏枚,45]
根據遞歸順序:
(3)返回2和返回4進行歸并:[11, 23, 32, 45, 77, 86]
(4)右邊大子表步驟和上面步驟一樣:[4, 22, 37, 58, 63, 93]
(5)最后進行總合并 :[4, 11, 22, 23, 32, 37, 45, 58, 63, 77, 86, 93]
至此排序結束
?打印每個步驟的數組:
?
?至此歸并排序就到這里講解結束了,細看的話其實一點也不復雜晓猛。