使用Python實現基數排序算法

基數排序是一種非比較型整數排序算法,核心思想是按數字每一位(從低位到高位)分桶收集。基本步驟:先確定數組中最大數的位數,再從最低位到最高位,對每一位數字進行“分桶”(0-9共10個桶)和“收集”操作,將當前位數字相同的元素放入同一桶,按桶順序收集更新數組,直至所有位處理完畢。Python實現通過循環位數、計算當前位數字分桶並收集,時間複雜度爲O(d×(n+k))(d爲最大數位數,n爲數組長度,k=10),空間複雜度O(n+k)。適合位數少的整數數組,處理負數時可先轉正數排序再恢復符號。

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

桶排序是基於分治思想的非比較型排序算法,通過分桶、桶內排序、合併實現整體有序。核心步驟:根據數據分佈特點分桶,桶內元素少,用簡單排序(如內置排序)處理,最後合併所有桶結果。 適用場景:數據均勻分佈且範圍有限時效率接近線性(O(n));分佈不均可能退化爲O(n²),性能低於快速排序。 Python實現(以0-1區間浮點數爲例):創建n個空桶(n爲數據長度),按`int(num*n)`分配數據到對應桶,桶內排序後合併所有桶元素。代碼簡潔,但需根據數據範圍調整桶索引計算,優化桶大小避免極端值集中。 總結:適合均勻分佈數據,利用分治降低複雜度,需關注數據分佈特性以避免性能退化。

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

計數排序是高效非比較型排序算法,適用於整數且取值範圍較小的場景,時間複雜度O(n+k)(n爲元素數,k爲數據範圍)。核心步驟:1.確定數據範圍(找min和max);2.構建計數數組統計各元素出現次數;3.按順序輸出計數數組元素(次數對應輸出次數)。它穩定(重複元素相對順序不變),內存佔用取決於數據範圍,適合重複元素多或範圍小的整數數據(如考試分數)。Python實現通過邊界處理、統計次數等完成排序,測試驗證對含重複元素及負數數組的適用性。

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

歸併排序基於分治法,核心分三步:分解(將數組拆分爲左右子數組,直至單元素)、遞歸排序(各子數組遞歸排序)、合併(合併有序子數組爲整體有序數組)。 以數組[3,1,4,2]爲例,分解後遞歸排序各子數組,再合併爲[1,2,3,4]。Python實現含合併函數(按序合併兩個有序子數組)與遞歸排序函數(分解並遞歸調用合併)。 其特點:時間複雜度O(n log n),空間複雜度O(n)(需額外存儲合併結果),爲穩定排序(相等元素相對順序不變)。

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

堆排序是利用堆數據結構的高效排序算法,時間複雜度穩定爲O(n log n),空間複雜度O(1),適合大規模數據排序。堆是完全二叉樹,父節點值≥(最大堆)或≤(最小堆)子節點值。數組中堆的索引關係:父節點i的子節點爲2i+1、2i+2,子節點j的父節點爲(j-1)//2。 核心操作包括:1. **Heapify**:調整以i爲根的子樹爲最大堆,遞歸比較子節點並交換;2. **構建最大堆**:從最後非葉子節點(n//2-1)向上調整所有節點,確保整體滿足最大堆性質。 排序流程:先構建最大堆,再反覆交換堆頂(最大值)與堆尾元素,同時調用Heapify調整剩餘元素爲最大堆,最終得到有序數組。堆排序爲原地排序,適用於大數據量場景。

閱讀全文
使用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實現爲例,外層循環遍歷待插入元素(從索引1開始),內層循環通過while比較並後移元素,用臨時變量temp保存當前元素,最終插入到正確位置。代碼爲原地排序,僅用一個臨時變量,空間複雜度O(1)。 時間複雜度:最好情況(數組已排序)O(n),最壞情況(逆序)O(n²);空間複雜度O(1)。適用於小規模數據或基本有序數據,實現簡單且穩定。

閱讀全文
使用Python實現快速排序算法

快速排序基於“分而治之”思想,核心是選基準值分區並遞歸排序。基本思路:選基準值(如數組首元素),將數組分爲小於和大於基準值的兩部分,再遞歸處理子數組。 分區過程是關鍵:通過左右指針遍歷,右指針左移找小於基準值元素,左指針右移找大於基準值元素,交換後繼續,直到指針相遇,交換基準值到最終位置,完成分區。 Python實現中,`partition`函數確定基準位置,`quick_sort`遞歸處理左右子數組。測試代碼驗證了排序效果。 複雜度:平均O(n log n)(分區均衡),最壞O(n²)(如已排序數組且基準選首元素,可通過隨機選基準優化)。 快速排序是高效實用的排序算法,廣泛應用於實際場景,理解其分區邏輯和遞歸過程是掌握排序算法的關鍵。

閱讀全文
使用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實現桶排序算法

桶排序是一種非比較型排序算法,核心是將數據分配到若干“桶”中,桶內局部排序後合併,適用於數據分佈均勻、範圍不大的場景(如整數且範圍可控)。步驟爲確定桶數量與範圍(如整數範圍0到max,桶數max+1),創建對應桶容器,遍歷元素分配到對應桶,桶內排序(如用插入排序或內置方法),最後按桶順序合併元素。時間複雜度理想下爲O(n),空間複雜度O(n)。優點是均勻分佈時高效,缺點是數據範圍大時空間浪費,分佈不均時效率下降。

閱讀全文
使用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實現堆排序算法

堆排序是基於堆數據結構的高效排序算法,時間複雜度O(n log n),空間複雜度O(1),屬原地排序,適合大規模數據。堆是特殊完全二叉樹,分大頂堆(父節點值大於子節點)和小頂堆,堆排序採用大頂堆。核心思想:每次取出堆頂最大值放數組末尾,調整剩餘元素爲新大頂堆,重複直至有序。 實現分三步:構建大頂堆(從最後一個非葉子節點開始,用heapify調整各節點);調整堆(遞歸調整子樹,維護大頂堆性質);排序過程(交換堆頂與末尾元素,縮小堆範圍後重復調整)。核心函數heapify通過比較父子節點,遞歸調整子樹至大頂堆;buildMaxHeap從倒數第二個節點起構建完整大頂堆;主函數整合上述步驟完成排序。堆排序通過高效調整堆實現有序,適用於空間受限場景,是大規模數據排序的高效選擇。

閱讀全文
使用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)進一步提升性能。

閱讀全文
使用Java實現插入排序算法

插入排序是一種簡單直觀的排序算法,核心思想是將未排序元素逐個插入已排序部分的正確位置,類似整理撲克牌。適合小規模數據,實現簡單。 基本思路:從第2個元素開始,將當前元素記爲“待插入元素”,與已排序部分從後往前比較,若已排序元素更大則後移,直至找到插入位置,重複操作直至所有元素處理完畢。 Java實現需保存待插入元素,通過循環比較並後移元素完成插入。算法時間複雜度:最好O(n)(已排序),最壞和平均O(n²);空間複雜度O(1)(原地排序);穩定排序,適用於小規模數據或幾乎有序數據。 其核心在於“逐步插入”,實現簡單,穩定性和原地性使其在小規模排序中表現良好。

閱讀全文
使用Java實現快速排序算法

快速排序基於分治思想,核心是選基準元素分區(小於和大於基準),遞歸處理子數組,平均時間複雜度O(n log n),是常用高效排序算法。基本步驟:選基準(如最右元素),分區後遞歸排序左右子數組。分區邏輯:以最右元素爲基準,定義i指向“小於基準區域”末尾,遍歷數組交換小於基準的元素,最後將基準移至正確位置。Java代碼實現了該邏輯。時間複雜度平均O(n log n),最壞O(n²),空間平均O(log n)。缺點是不穩定排序,最壞性能較差,需注意基準選擇優化性能。

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

冒泡排序是基礎排序算法,核心思想是重複比較相鄰元素並交換位置,使較大元素“冒泡”到數組末尾(升序)。其排序步驟通過多輪迭代完成:每輪確定當前未排序部分的最大元素位置並移至末尾,直到數組有序。 Java代碼實現中,外層循環控制排序輪數(最多n-1輪),內層循環比較相鄰元素並交換。關鍵優化是通過`swapped`標記,若某輪無交換則提前終止,最好情況下時間複雜度降爲O(n)。時間複雜度最壞和平均爲O(n²),空間複雜度O(1)(原地排序)。 冒泡排序原理簡單直觀,適合教學理解排序核心,但效率較低,僅適用於小規模數據或教學場景,實際大規模數據排序多采用快速排序等高效算法。

閱讀全文
Pytorch神經網絡入門:全連接層與反向傳播原理

本文介紹PyTorch神經網絡基礎,核心圍繞全連接層與反向傳播。全連接層實現前一層神經元與當前層全連接,輸出爲權重矩陣乘輸入加偏置向量。前向傳播是數據從輸入層經全連接層、激活函數到輸出層的正向計算過程,如兩層網絡:輸入→全連接→ReLU→全連接→輸出。 反向傳播是神經網絡學習的核心,通過梯度下降調整參數。原理基於鏈式法則,從輸出層反向計算損失對各參數的梯度,PyTorch的autograd自動記錄計算圖並完成梯度計算。流程包括前向傳播、計算損失、反向傳播(loss.backward())、參數更新(優化器如SGD)。 關鍵概念:全連接層實現特徵組合,前向傳播正向計算,反向傳播通過梯度下降最小化損失,自動求導簡化梯度計算。理解這些原理有助於模型調試與優化。

閱讀全文
快速入門Pytorch:張量維度變換與常用操作

這篇文章介紹了Pytorch張量的核心知識,包括基礎、維度變換、常用操作及練習建議。張量是Pytorch存儲數據的基本結構,類似NumPy數組,支持GPU加速和自動求導。創建方式有:從列表/數值用`torch.tensor()`,從NumPy數組用`torch.from_numpy()`,或用內置函數生成全0/1/隨機張量。 維度變換是關鍵操作:`reshape()`靈活調整形狀(元素總數不變),`squeeze()`去掉單維度,`unsqueeze()`增加單維度,`transpose()`和`permute()`交換維度。常用操作包括基礎算術運算、矩陣乘法`matmul()`、廣播機制(自動擴展維度運算)及聚合操作(`sum()`/`mean()`/`max()`等)。 文章建議通過練習鞏固張量操作,如維度調整、廣播機制和維度交換,以掌握“形狀語言”,爲後續模型構建奠定基礎。

閱讀全文
Pytorch基礎教程:Dataset與DataLoader加載數據實戰

數據加載是機器學習訓練的關鍵環節,PyTorch的`Dataset`和`DataLoader`是高效管理數據的核心工具。`Dataset`作爲數據存儲抽象基類,需繼承實現`__getitem__`(讀取單個樣本)和`__len__`(總樣本數),也可直接用`TensorDataset`包裝張量數據。`DataLoader`則負責批量處理,支持`batch_size`(批次大小)、`shuffle`(打亂順序)、`num_workers`(多線程加載)等參數,優化訓練效率。 實戰中,以MNIST爲例,通過`torchvision`加載圖像數據,結合`Dataset`和`DataLoader`實現高效迭代。需注意Windows下`num_workers`默認設爲0,避免內存問題;訓練時`shuffle=True`打亂數據,驗證/測試集設爲`False`保證可復現。 關鍵步驟:1. 定義`Dataset`存儲數據;2. 創建`DataLoader`設置參數;3. 迭代`DataLoader`輸入模型訓練。二者是數據處理基石,掌握後可靈活應對各類數據加載需求。

閱讀全文
零基礎玩轉Pytorch:數據可視化與模型評估技巧

本文介紹Pytorch中數據可視化與模型評估的核心技能,助力高效調試模型。數據可視化方面,Matplotlib可觀察數據分佈(如MNIST樣本及標籤直方圖)、TensorBoard監控訓練過程(標量變化、模型結構)。模型評估中,分類任務需關注準確率、混淆矩陣(如MNIST分類示例),迴歸任務用MSE、MAE。實戰中,通過可視化發現問題(如“8”“9”混淆),迭代優化模型。進階可探索GAN可視化、即時指標計算等。掌握這些技能能快速定位問題、理解數據,爲複雜模型開發奠基。

閱讀全文
Pytorch入門到實踐:用簡單例子理解模型構建

這篇Pytorch入門教程涵蓋核心知識點:Pytorch基於Python,動態計算圖優勢明顯,安裝簡單(`pip install torch`)。核心數據結構是張量(Tensor),支持GPU加速,可創建、操作(加減乘除、矩陣乘法)及與NumPy互轉。自動求導(autograd)通過`requires_grad=True`實現梯度計算,如`y=x²+3x`在x=2時導數爲7。線性迴歸模型繼承`nn.Module`定義,前向傳播實現`y=wx+b`。數據準備生成模擬數據(`y=2x+3+噪聲`),通過`TensorDataset`和`DataLoader`批量加載。訓練用MSE損失與SGD優化器,循環中梯度清零、反向傳播、參數更新,1000輪後驗證並可視化結果,學習到參數接近真實值。核心流程涵蓋張量操作、自動求導、模型構建、數據加載及訓練優化,可擴展至複雜模型。

閱讀全文