技術問答
技術文章
iT 徵才
Tag
聊天室
2024 鐵人賽
登入/註冊
問答
文章
Tag
邦友
鐵人賽
搜尋
2024 iThome 鐵人賽
DAY
22
0
佛心分享-IT 人自學之術
自學Java物件導向程式語言
系列 第
22
篇
Java程式-認識演算法
16th鐵人賽
新店劉以豪
2024-10-06 22:54:08
73 瀏覽
分享至
排序演算法
冒泡排序 (Bubble Sort)
原理:重複地遍歷數列,比較相鄰元素並交換它們的順序。每次遍歷後,最大或最小的元素會「冒泡」到數列的一端。
時間複雜度:
最壞和平均情況:𝑂(𝑛²)
最好情況:𝑂(𝑛)(當數列已經排好序)
特點:簡單直觀,但效率低下,適合小數據集或教學用途。
選擇排序 (Selection Sort)
原理:將數列分為已排序和未排序兩部分,重複選擇未排序部分的最小(或最大)元素並將其放置到已排序部分的末尾。
時間複雜度:
所有情況均為 𝑂(𝑛²)
特點:雖然簡單,卻不如其他排序算法高效,通常不適合大型數據集。
插入排序 (Insertion Sort)
原理:將數列分為已排序和未排序兩部分,重複將未排序部分的第一個元素插入到已排序部分的正確位置。
時間複雜度:
最壞情況:O(n²)
最好情況:𝑂(𝑛)(當數列已經排好序)
特點:對於小規模或幾乎已排序的數據非常高效,因為它在大部分情況下可以快速找到插入位置。
快速排序 (Quick Sort)
原理:選擇一個「基準」元素,將數列分為比基準小和比基準大的兩部分,然後遞迴地對這兩部分進行排序。
時間複雜度:
最壞情況:
𝑂(𝑛²)(當選擇的基準元素不佳)
平均情況:𝑂(𝑛log𝑛)
特點:在大多數情況下非常高效,且常被用作一般排序的標準方法。選擇好的基準元素(如隨機選擇或三數取中)可以顯著提高性能。
合併排序 (Merge Sort)
原理:將數列分為兩半,對每一半進行遞迴排序,然後將兩個已排序的部分合併。
時間複雜度:
所有情況均為:O(nlogn)
特點:穩定且適合大數據集,特別是在鏈表中表現良好。需要額外的空間來存儲合併結果。
堆排序 (Heap Sort)
原理:將數列視為一棵完全二叉樹,首先構建一個最大堆,然後重複將最大元素放到數列末尾並調整堆。
時間複雜度:
所有情況均為:O(nlogn)
特點:不需要額外的空間,且是基於樹結構的排序方法,適合需要原地排序的情況。
計數排序 (Counting Sort)
原理:適用於範圍有限的整數,通過計算每個元素出現的次數來構建已排序數列。
時間複雜度:
O(n+k)(其中k是數列中最大元素的值)
特點:適合範圍有限的整數,效率高,但不適用於需要排序的範圍過大的情況。
基數排序 (Radix Sort)
原理:將數據按位進行排序,先按最低位排序,然後按次低位排序,依此類推。
時間複雜度:
O(n⋅k)(其中k 是數字的位數)
特點:適合大量整數排序,特別是位數相對較少的情況。
搜尋演算法
線性搜尋 (Linear Search)
原理:從數據結構的起始位置開始,逐個檢查每個元素,直到找到目標元素或遍歷完所有元素。
時間複雜度:
最壞情況和平均情況均為:𝑂(𝑛)
適用情況:適合小數據集或未排序的數據。
二分搜尋 (Binary Search)
原理:對已排序的數據進行搜尋,首先比較目標元素與中間元素。如果目標元素小於中間元素,則在左半部分繼續搜尋,反之則在右半部分。
時間複雜度:
最壞情況和平均情況均為:𝑂(log𝑛)
適用情況:僅適用於已排序的數據。
深度優先搜尋 (Depth-First Search, DFS)
原理:從一個節點開始,沿著每一個分支深入探索,直到無法繼續為止,然後回溯。
時間複雜度:
對於圖最壞情況為: 𝑂(𝑉+𝐸),其中 𝑉是節點數量,𝐸是邊的數量。
適用情況:適合尋找所有可能的解或遍歷整個圖形結構。
廣度優先搜尋 (Breadth-First Search, BFS)
原理:從一個節點開始,先探索其所有相鄰節點,再逐層向外擴展。
時間複雜度:,
最壞情況為:O(V+E)。
適用情況:適合尋找最短路徑或層級結構的問題。
哈希搜尋 (Hash Search)
原理:使用哈希表來存儲數據,利用哈希函數快速定位元素的位置。
時間複雜度:
最壞情況為:O(n)
平均情況下通常為:O(1)。
適用情況:當需要快速查找的時候,尤其適合鍵值對查找。
插值搜尋 (Interpolation Search)
原理:對已排序的數據進行搜尋,根據目標元素的值與數組邊界值的關係,計算預測的中間位置進行搜尋。
時間複雜度:
最壞情況為:𝑂(𝑛)但對於均勻分佈的數據。
平均情況可以達到:𝑂(loglog𝑛)
適用情況:適合數據均勻分佈的已排序數據。
留言
追蹤
檢舉
上一篇
Java程式-改進抽卡遊戲&從java學習演算法
下一篇
Java程式-學習泡沫排序法
系列文
自學Java物件導向程式語言
共
30
篇
目錄
RSS系列文
訂閱系列文
2
人訂閱
26
Java程式-快速排序法
27
Java程式-合併排序法
28
Java程式-基數排序法
29
Java程式-堆積排序法
30
Java程式-自學感性小結
完整目錄
直播研討會
{{ item.subject }}
{{ item.channelVendor }}
{{ item.webinarstarted }}
|
{{ formatDate(item.duration) }}
直播中
立即報名
尚未有邦友留言
立即登入留言
iThome鐵人賽
參賽組數
1064
組
團體組數
40
組
累計文章數
22207
篇
完賽人數
600
人
看影片追技術
看更多
{{ item.subject }}
{{ item.channelVendor }}
|
{{ formatDate(item.duration) }}
直播中
熱門tag
看更多
15th鐵人賽
16th鐵人賽
13th鐵人賽
14th鐵人賽
12th鐵人賽
11th鐵人賽
鐵人賽
2019鐵人賽
javascript
2018鐵人賽
python
2017鐵人賽
windows
php
c#
windows server
linux
css
react
vue.js
熱門問題
硬盤只能在舊電腦上讀到 在新電腦上顯示不明硬盤
請問在ERP當中如何管理油漆、螺絲物料?
Python多執行緒日誌記錄系統問題
這屆鐵人賽有完賽禮嗎?有人收到嗎?
Redhat Idm (Free IPA) WEB 界面 admin 無法登入
Outlook 會跳出"插入智慧卡"(有安裝HiCOS卡片管理工具)
WINDOW共用問題
VM Workstation 17.6 自動暫停問題
Windows 內建APP
標籤資料無法完整的顯示
熱門回答
商品計價公式
Python多執行緒日誌記錄系統問題
共用資料夾突然無法使用
Outlook 會跳出"插入智慧卡"(有安裝HiCOS卡片管理工具)
比對2欄資料,帶入新資料
熱門文章
每日一篇學習筆記 直到我做完專題 :( [Day38]
為什麼 C 語言中的 printf() 會多那個討人厭的 “f”?
每日一篇學習筆記 直到我做完專題 :( [Day39]
Day 40 - 使用 Angular 原理圖從裝飾器遷移到函數
每日一篇學習筆記 直到我做完專題 :( [Day39]
IT邦幫忙
×
標記使用者
輸入對方的帳號或暱稱
Loading
找不到結果。
標記
{{ result.label }}
{{ result.account }}