使用C++實現歸併排序算法

歸併排序基於分治思想,核心是“分解-合併”:先遞歸將數組拆分爲單個元素(子數組有序),再合併兩個有序子數組爲更大有序數組。 分解過程:遞歸將數組從中間拆分,直到子數組僅含1個元素。合併過程:比較兩個有序子數組元素,取較小值依次放入結果數組,處理剩餘元素。 C++實現含兩個核心函數:`mergeSort`遞歸分解數組,`merge`合併兩個有序子數組。時間複雜度O(n log n),空間複雜度O(n)(需臨時數組)。 歸併排序穩定且高效,適合大規模數據排序。示例中數組`[5,3,8,6,2,7,1,4]`經分解合併後得到有序數組`[1,2,3,4,5,6,7,8]`,驗證算法正確性。

閱讀全文
使用C++實現堆排序算法

堆排序是基於堆數據結構的高效排序算法,時間複雜度O(n log n),空間複雜度O(1),適用於大規模數據。堆是特殊完全二叉樹,分大頂堆(父≥子)和小頂堆,排序常用大頂堆。其存儲爲數組,索引i的父節點爲(i-1)/2,左右子節點爲2i+1和2i+2。核心步驟:1.構建初始大頂堆(從最後非葉子節點向上調整);2.排序(交換堆頂與未排序末尾元素,調整堆,重複直至完成)。C++實現包含swap、max_heapify(迭代調整子樹爲大頂堆)、heap_sort(構建堆並排序)函數,主函數測試數組排序,輸出結果正確。

閱讀全文
使用C++實現冒泡排序算法

冒泡排序是經典入門排序算法,核心思想如氣泡上浮,通過重複比較相鄰元素並交換逆序對,使小元素逐步“冒”到數組頂端。基本過程:每輪從首元素開始,相鄰元素比較,逆序則交換,每輪確定一個最大元素位置,直至數組有序。 C++實現中,`bubbleSort`函數外層循環控制輪數(最多n-1輪),內層循環比較相鄰元素並交換,用`swapped`標記優化,若某輪無交換則提前退出。時間複雜度最壞/平均O(n²),最好O(n)(優化後),空間複雜度O(1),穩定排序。 其直觀易理解,雖效率不高,但掌握“比較交換”邏輯是學習排序基礎的關鍵,適合算法入門實踐。

閱讀全文
使用Python實現選擇排序算法

選擇排序是簡單直觀的排序算法,核心思想是每次從待排序元素中選出最小(或最大)元素,放入已排序部分末尾,直至完成排序。步驟爲:初始化假設當前元素最小,遍歷未排序部分找更小元素,交換到已排序末尾,重複至結束。 Python實現中,外層循環變量i控制已排序部分末尾(從0到n-2),內層循環變量j遍歷未排序部分(從i+1到n-1)找最小元素位置min_index,最後交換arr[i]與arr[min_index]。測試數組[64,25,12,22,11]排序後爲[11,12,22,25,64]。 時間複雜度O(n²),空間複雜度O(1),原地排序。特點:簡單易理解,但不穩定(相同元素可能交換順序),適合小規模數據。

閱讀全文
使用Python實現希爾排序算法

希爾排序是插入排序的改進版,通過分組縮小元素間隔,先“粗排”再“精排”提升效率。核心是選擇初始增量(如數組長度的一半),將數組分爲若干組,組內元素間隔爲增量,對每組用插入排序;隨後增量減半,重複分組排序,直至增量爲1時完成“精排”。 其關鍵邏輯是通過分組減少元素移動次數:初始分組大(元素間隔大),先讓數組基本有序;逐步縮小增量,最終以插入排序收尾。時間複雜度平均爲O(n log n),最壞O(n²),空間複雜度O(1),適用於中等規模、元素分佈不均的數組,是原地排序的高效算法。

閱讀全文
使用Python實現冒泡排序算法

### 冒泡排序:基礎排序算法解析 冒泡排序基於“氣泡上升”原理,核心思想是重複比較相鄰元素,交換錯誤順序的元素,使較大元素逐步“冒泡”到數組末尾,直至整體有序。其工作步驟爲:多輪遍歷數組,每輪比較相鄰元素並交換逆序對,每輪結束後最大未排序元素歸位;若某輪無交換,說明數組已有序,提前終止。 Python實現中,通過外層循環控制排序輪數(最多n-1輪),內層循環比較相鄰元素並交換,用`swapped`標誌優化終止條件。時間複雜度最壞爲O(n²)(完全逆序),最好爲O(n)(已排序,優化後),空間複雜度O(1),且爲穩定排序。 冒泡排序簡單直觀,適合小規模數據,是理解排序思想的基礎。通過其原理與Python代碼實現,可快速掌握相鄰元素比較交換的核心邏輯。

閱讀全文
使用Java實現基數排序算法

基數排序是一種非比較型整數排序算法,通過按數位從低位到高位處理數字,將每個數字按當前數位分配到“桶”中,再按桶順序收集回原數組,重複直至所有數位處理完畢,適合位數少的整數,效率較高。基本思想是“分配-收集-重複”:按當前數位(個位、十位等)分配到對應桶,按桶順序收集回數組,循環處理所有數位。 以數組[5,3,8,12,23,100]爲例,經個位、十位、百位三輪處理完成排序。Java代碼中,通過找到最大數確定最高數位,用`(num / radix) % 10`獲取當前位,以ArrayList爲桶實現分配收集。時間複雜度O(d(n+k))(d爲最大數位數,k=10),空間O(n+k)。該算法穩定,適合整數排序,負數可分離正負後分別排序再合併。

閱讀全文
使用Java實現計數排序算法

計數排序是簡單直觀的非比較型排序算法,通過統計元素出現次數並結合前綴和確定位置,適用於元素範圍小(如整數)、重複元素多且需穩定排序的場景。其核心思路:先確定元素範圍(找min和max),統計各元素出現次數,計算前綴和得到元素最後位置,再從後遍歷原數組生成排序結果。 實現步驟:處理邊界(空/單元素數組無需排序),確定min/max,創建計數數組統計次數,計算前綴和(累加得到元素最後位置),從後遍歷生成結果。時間複雜度O(n+k)(n爲數組長度,k爲元素範圍),空間複雜度O(n+k)。適用場景爲整數範圍小(如分數、年齡)、重複元素多且需穩定排序。該算法通過計數和累加實現,無需比較,適合初學者理解排序基本思想。

閱讀全文
使用Java實現歸併排序算法

歸併排序是基於分治思想的高效排序算法,核心爲分解、解決、合併三步:先將數組遞歸分解爲單元素子數組,再遞歸排序子數組,最後合併兩個有序子數組爲整體有序數組。 Java實現中,`mergeSort`方法通過遞歸分解數組爲左右兩半,分別排序後調用`merge`合併。`merge`方法使用三個指針遍歷左右子數組,比較元素大小並填充結果數組,剩餘元素直接複製。 算法複雜度:時間複雜度O(n log n)(每次合併O(n),遞歸深度log n),空間複雜度O(n)(需額外數組存儲合併結果),且爲穩定排序(相等元素相對順序不變)。 歸併排序邏輯清晰,適合大數據量排序,是分治算法的經典案例,通過遞歸分解與合併有序子數組實現高效排序。

閱讀全文
使用Java實現選擇排序算法

選擇排序是一種簡單直觀的排序算法,核心思想是每次從無序部分選取最小(或最大)元素,放入已排序部分末尾,重複此過程直至全部有序。其基本思路爲:外層循環確定已排序部分的末尾位置,內層循環在未排序部分中尋找最小值,交換該最小值與外層循環當前位置的元素,直至完成排序。 Java實現中,`selectionSort`方法通過兩層循環實現:外層循環遍歷數組(`i`從0到`n-2`),內層循環(`j`從`i+1`到`n-1`)尋找未排序部分的最小值索引`minIndex`,最後交換`i`位置元素與`minIndex`位置元素。以數組`{64,25,12,22,11}`爲例,每輪交換後逐步構建有序數組,最終結果爲`[11,12,22,25,64]`。 時間複雜度爲O(n²),適用於小規模數據。該算法邏輯簡單、代碼易實現,是理解排序基礎思想的典型示例。

閱讀全文
使用Java實現希爾排序算法

希爾排序是插入排序的改進版,通過分組插入減少逆序時的移動次數。核心是引入步長(Gap),將數組分Gap個子序列,對各子序列插入排序後,逐步縮小Gap至1(等價普通插入排序)。算法步驟:初始化Gap爲數組長度一半,對每個子序列執行插入排序,再縮小Gap重複直至爲0。Java實現中,外層循環控制Gap從n/2遞減,內層循環遍歷元素,用臨時變量保存當前元素,向前比較並移動元素至正確位置完成插入。測試數組{12,34,54,2,3}排序後爲[2,3,12,34,54]。其通過分組逐步有序化提升效率,可優化步長序列(如3k+1)進一步提升性能。

閱讀全文
排序算法的‘雙維度’:時間複雜度與空間複雜度入門

排序算法的雙維度複雜度(時間與空間)是選擇算法的核心依據。時間複雜度上,小數據量(n≤1000)可用冒泡、選擇、插入排序(O(n²)),大數據量(n>10000)則選快速、歸併、堆排序(O(n log n))。空間複雜度中,堆排序、冒泡等爲O(1)(原地排序),快速排序O(log n),歸併排序O(n)。兩者需權衡:如歸併排序以O(n)空間換穩定的O(n log n)時間,快速排序用O(log n)空間平衡效率。初學者應先掌握簡單算法,再深入高效算法,依數據規模和空間限制選擇,實現“按需排序”。

閱讀全文
爲什麼說冒泡排序是‘初學者友好型’排序算法?

冒泡排序被稱爲“初學者友好型”排序算法,因其邏輯直觀、代碼簡單、示例清晰,能幫助初學者快速掌握排序核心思想。 定義:它通過重複比較相鄰元素,將較大元素逐步“冒”到數組末尾,最終實現有序,核心是“比較-交換”循環——外層控制輪數(最多n-1輪),內層遍歷比較相鄰元素並交換,若某輪無交換則提前終止。 初學者友好原因: 1. **邏輯直觀**:類似“排隊調整”,直觀理解兩兩交換與逐步有序; 2. **代碼簡單**:嵌套循環實現,結構清晰(外層輪數、內層比較交換,優化後提前終止); 3. **示例清晰**:如[5,3,8,4,2]的排序過程(每輪冒最大數到末尾),具體步驟易理解; 4. **理解本質**:幫助理解“有序”“交換”“終止條件”等排序核心要素。 雖時間複雜度O(n²)、效率低,但作爲排序啓蒙工具,能讓初學者“先學會走路”,爲後續學習快速排序等算法奠基。

閱讀全文
撲克牌排序啓示:插入排序的生活類比與實現

這篇文章介紹了插入排序算法。核心思想是逐步構建有序序列:默認首個元素已排序,從第二個元素起,將每個元素(待插入元素)插入到前面已排序序列的正確位置(需移動較大元素騰出空間)。以數組`[5,3,8,4,2]`爲例,演示了從後往前比較、移動元素的過程,關鍵步驟爲:遍歷數組,暫存待插入元素,移動已排序元素,插入位置。 算法特點:優點是簡單直觀、原地排序(空間複雜度O(1))、穩定且適合小規模或近乎有序數據;缺點是最壞時間複雜度O(n²),移動操作較多。總結而言,插入排序是理解排序算法的基礎,通過生活類比(如整理撲克牌)幫助理解,適用於簡單場景或小規模數據排序。

閱讀全文
選擇排序:最簡單排序之一,最少交換實現方法

選擇排序是計算機科學基礎排序算法,因邏輯簡單且交換次數最少,成爲初學者入門首選。其核心思路是將數組分爲已排序和未排序兩部分,每次在未排序部分中找到最小元素,與未排序部分的首元素交換,逐步擴展已排序部分,最終完成排序。例如對數組[64,25,12,22,11],通過多輪尋找最小元素並交換(如第一輪交換11至首,第二輪交換12至第二位等),可實現升序排列。 選擇排序交換次數最少(最多n-1次),時間複雜度爲O(n²)(無論最佳、最壞或平均情況),空間複雜度僅O(1)。其優點是算法簡單、交換成本低、空間需求小;缺點是時間效率低、不穩定排序(相等元素相對順序可能改變),適用於小規模數據排序或對交換次數敏感的場景(如嵌入式系統)。掌握選擇排序有助於理解排序核心思想,爲學習更復雜算法奠定基礎。

閱讀全文
排序算法的‘速度密碼’:時間複雜度與冒泡排序

這篇文章圍繞排序算法的“速度密碼”展開,核心是時間複雜度與冒泡排序。時間複雜度用大O表示法衡量,常見類型有O(n)(線性,隨數據量線性增長)、O(n²)(平方,數據量大時效率極低)、O(log n)(對數,速度極快),其是判斷算法快慢的關鍵。 冒泡排序作爲基礎算法,原理是通過相鄰元素比較交換,將小元素“上浮”、大元素“下沉”。以數組[5,3,8,4,2]爲例,重複遍歷比較相鄰元素,直至完成排序。其時間複雜度爲O(n²),空間複雜度O(1)(原地排序),優點是簡單易懂、邏輯直觀,缺點是效率低,數據量大時耗時極久。 總結:冒泡排序雖慢(O(n²)),但作爲入門工具,能幫助理解排序思想與時間複雜度,爲學習快速排序等高效算法(優化至O(n log n))奠定基礎。

閱讀全文
像整理桌面一樣學插入排序:原理與代碼

本文以“整理桌面”類比插入排序,核心思想是將元素逐個插入已排序部分的正確位置。基本步驟爲:初始化第一個元素爲已排序,從第二個元素開始,將其與已排序部分從後向前比較,找到插入位置後移元素,再插入當前元素。 以數組 `[5,3,8,2,4]` 爲例:初始已排序 `[5]`,插入3(移5後)得 `[3,5]`;插入8(直接追加)得 `[3,5,8]`;插入2(依次後移8、5、3,插入開頭)得 `[2,3,5,8]`;插入4(後移8、5,插入3後)完成排序。 代碼實現(Python)通過雙層循環:外層遍歷待插入元素,內層從後向前比較並後移元素。時間複雜度O(n²),空間複雜度O(1),適用於小規模數據或接近有序數據,是原地排序且無需額外空間。 該排序類比直觀體現“逐個插入”本質,對理解排序邏輯有幫助。

閱讀全文
零基礎學冒泡排序:手把手教學與代碼實現

### 冒泡排序概括 排序是將無序數據按規則重排的過程,冒泡排序是基礎排序算法,核心是通過相鄰元素比較交換,使較大元素逐步“冒泡”至數組末尾。 **核心思路**:每輪從數組起始位置開始,依次比較相鄰元素,若前大後小則交換,每輪結束後最大元素“沉底”,未排序部分長度減1,重複直至所有元素有序。 **步驟**:外層循環控制輪數(共n-1輪,n爲數組長度),內層循環每輪比較相鄰元素並交換,優化點爲若某輪無交換則提前終止。 **複雜度**:時間複雜度最壞O(n²)(完全逆序),最好O(n)(已排序),空間複雜度O(1)(原地排序)。 **特點與適用**:優點是簡單易實現,缺點效率低(O(n²)),適用於數據量小或對效率要求不高的場景(如教學演示)。 通過比較交換思想,冒泡排序爲理解複雜排序算法奠定基礎。

閱讀全文
Python實現常見的排序算法
2020-05-16 286 閱讀 其他 排序算法 算法 Python 排序算法

非常感謝您分享了這些排序算法的實現。爲了提供一個更加完善和易於理解的版本,我將對每種排序算法進行簡要解釋,並附上完整的代碼片段。此外,我還將在每個函數中加入必要的導入語句和註釋以提高代碼的可讀性。 ### 1. 冒泡排序 冒泡排序是一種簡單的排序方法,它重複地遍歷要排序的列表,一次比較兩個元素,如果它們的順序錯誤就把他們交換過來。遍歷多次後,最大的元素就到了最後。 ```python def

閱讀全文