演算法描述
本節中的第一種高階排序演算法是歸併排序。 「歸併」一詞,意為「合併」。顧名思義,歸併排序演算法就是一個先把數列拆分為子數列,對子數列進行排序後,再把有序的子數列合併為完整的有序數列的演算法。它實際上採用了分治的思想。
歸併排序的平均時間複雜度是O(nlgn),最好情況下的時間複雜度是O(nlgn),最糟情況下的時間複雜度也是O(nlgn)。它的空間複雜度是O(1)。另外,歸併排序還是一個穩定的排序演算法。
以升序排序為例,歸併演算法的流程如圖2-21所示。
原始數組是一個有8個數字的無序數組。一次操作後,把8個數的陣列分成兩個4個數字組成的無序數組。每個操作都將無序數組分成兩半,直到所有最小的子數組僅包含一個元素。當數組裡只有一個元素時,這個數組必定是有順序的。然後,程式開始把小有序的數組每兩個合併成為一個大的有序數組。首先是將兩個包含一個數的數組合併成一個包含兩個數的數組,然後再把兩個包含兩個數的數字組合併成一個包含四個數的數組,最後合併成一個包含八個數的數組。當所有有序數組合併完畢時,形成的最長有序數組就完成排序。
程式碼實作
歸併排序程式碼:
#归并排序 nums = [5,3,6,4,1,2,8,7] def MergeSort(num): if(len(num)<=1): #递归边界条件 return num #到达边界时返回当前的子数组 mid = int(len(num)/2) #求出数组的中位数 llist,rlist = MergeSort(num[:mid]),MergeSort(num[mid:])#调用函数分别为左右数组排序 result = [] i,j = 0,0 while i < len(llist) and j < len(rlist): #while循环用于合并两个有序数组 if rlist[j]<llist[i]: result.append(rlist[j]) j += 1 else: result.append(llist[i]) i += 1 result += llist[i:]+rlist[j:] #把数组未添加的部分加到结果数组末尾 return result #返回已排序的数组 print(MergeSort(nums))
執行程序,輸出結果為:
[1,2,3,4,5,6,7,8]
在MergeSort ()函數中,首先進行的是邊界條件判斷。當一個只包含一個元素的陣列作為函數參數時,該元素單獨存在於數組中,因此該數組已經達到了最小大小。完成遞歸分解數組的任務後,只需將分解的陣列返回到上一層遞歸即可。
如果未排序數組的長度仍然大於1,那麼使用變數mid來儲存數組最中間的下標,把未排序數組分成左右兩個子數組。然後,新建兩個數組,用來儲存排好序的左右子數組。這裡使用了遞歸的思想。我們只把MergeSort()函數視為一個為列表排序的函數,儘管在MergeSort()函數內部,也可以呼叫函數本身對兩個子數組進行排序。
隨後,使用while循環合併兩個已經有順序的陣列。由於無法確定兩個數組中元素的相對大小,所以我們採用i和j兩個變數分別標記在左子數組和右子數組中等待加入的元素的位置。當while循環結束時,可能一個子數組的末尾還剩餘一些最大的元素沒有被添加到result列表中,所以result =llist[i:] rlist[j:]語句是為了防止漏掉這些元素。數字組合併完成後,函數輸出有序數組。
以上是python排序演算法之歸併排序怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

選擇Python還是C 取決於項目需求:1)如果需要快速開發、數據處理和原型設計,選擇Python;2)如果需要高性能、低延遲和接近硬件的控制,選擇C 。

通過每天投入2小時的Python學習,可以有效提升編程技能。 1.學習新知識:閱讀文檔或觀看教程。 2.實踐:編寫代碼和完成練習。 3.複習:鞏固所學內容。 4.項目實踐:應用所學於實際項目中。這樣的結構化學習計劃能幫助你係統掌握Python並實現職業目標。

在兩小時內高效學習Python的方法包括:1.回顧基礎知識,確保熟悉Python的安裝和基本語法;2.理解Python的核心概念,如變量、列表、函數等;3.通過使用示例掌握基本和高級用法;4.學習常見錯誤與調試技巧;5.應用性能優化與最佳實踐,如使用列表推導式和遵循PEP8風格指南。

Python適合初學者和數據科學,C 適用於系統編程和遊戲開發。 1.Python簡潔易用,適用於數據科學和Web開發。 2.C 提供高性能和控制力,適用於遊戲開發和系統編程。選擇應基於項目需求和個人興趣。

Python更適合數據科學和快速開發,C 更適合高性能和系統編程。 1.Python語法簡潔,易於學習,適用於數據處理和科學計算。 2.C 語法複雜,但性能優越,常用於遊戲開發和系統編程。

每天投入兩小時學習Python是可行的。 1.學習新知識:用一小時學習新概念,如列表和字典。 2.實踐和練習:用一小時進行編程練習,如編寫小程序。通過合理規劃和堅持不懈,你可以在短時間內掌握Python的核心概念。

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1
好用且免費的程式碼編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),