發表文章

Sorting Algorithm 排序演算法介紹

前言 在本部落格的文章: Python 排序演算法範例 ( Sorting Algorithms in Python ) 有介紹一些常見的四種排序演算法:插入排序、選擇排序、合併排序、氣泡排序。除了這四種之外還有其他的嗎? 當然有!!! 1. 什麼是排序演算法?(排序在做什麼) 排序(Sorting)是指將一組資料(元素)依照 特定的規則 重新排列組合。 日常生活中: 例如將考卷依分數「由低到高」排列,或是將包裹依體積「由大到小」放置。 電腦科學中: 排序是資訊處理的核心基礎。主要是將資料依照「數值大小」(如整數、浮點數)或「字典順序」(如英文字母 A~Z、中文編碼)進行排列。 2. 為什麼會有這麼多種排序演算法? 既然目的都是為了「排好資料」,為什麼科學家要發明幾十種不同的方法?主要原因在於「沒有任何一種演算法在所有情境下都是完美的」。選擇演算法時通常會考量以下關鍵因素: 資料量的大小: 有些演算法(如氣泡排序、選擇排序)程式碼非常簡單,在資料量極小(例如 10 筆資料)時效率很高;但當資料量極大(例如 100 萬筆資料)時,計算時間會暴增,這時就必須使用高效能的演算法(如快速排序、合併排序)。 時間複雜度(計算量): 評估演算法執行速度的指標。例如: 平方時間複雜度 $O(n^2)$ :資料量增加 10 倍,執行時間可能增加 100 倍(如氣泡、選擇、插入排序)。 線性對數時間複雜度 $O(n \log n)$ :效能較佳,適合處理大數據(如快速、合併、堆積排序)。 資料的實際分佈狀況: 資料是已經「幾乎排好」還是「完全混亂」? 例如: 插入排序法 在面對「幾乎已經排好」的資料時,速度非常快。 空間複雜度(記憶體佔用): 有些演算法在排序過程中需要額外的記憶體空間來暫存資料(如合併排序),在記憶體受限的嵌入式系統中就需要謹慎使用。 穩定性(Stability): 如果資料中有兩個數值相同的元素,排序後它們的相對前後順序是否會改變?這在某些商用資料處理中非常重要。 3. 常見的排序演算法分類 根據文中提及的演算法,我們可以依據其運作原理(比較式 vs 非比較式)來分類: 核心分類:比較式排序 (Comparison-based) 這類演算法是透過「兩兩比較資料的大小」來決定順序,也是最常見的類型。 基礎四種(文中提及 Python ...

使用 Gemini 製作學習單的流程

圖片
最近使用 Gemini 製作學習單的流程如下: 1. 請以資訊科技主題陣列,設計給臺灣國中八年級的10分鐘試教大綱,內容要能引起學生動機。 2. 請製作上述內容的學習單 3. 將學習單的內容製作成四格漫畫 4. 請講一個與陣列有關的笑話。 5. 請將學習單製作成word檔案與pdf檔案 6. 修改檔案。 7. 分享連結!?  https://share.gemini.google/sTZf3R55IfGA 學習單的圖片如下

Mastering Pointers in C/C++: 10 Practical Coding Exercises for Beginners

If you are diving into C or C++ programming, there is one concept you simply cannot escape: Pointers . Often considered the first major hurdle for beginners, pointers are actually incredibly powerful tools that give you direct access to memory and help you write highly efficient code. Before jumping into the exercises below, if you need a quick conceptual refresher, I highly recommend checking out some classic guides such as [Pointers in C Programming: What is Pointer, Types & Examples] or an [Introduction to C Pointers]. To help you solidifying your understanding, here are 10 practical pointer exercises , complete with reference solutions. Let's code! Exercise 1: Basic Pointer Syntax Goal: Design a C program to demonstrate the foundational syntax of pointers, including pointer declaration, address-of retrieval ( & ), and dereferencing ( * ). Reference Solution: /* Pointer Basic Syntax Author: Holan */ # include <stdio.h> # include <stdlib.h> int main () ...

掌握樹莓派的瑞士刀:Raspbian / Debian Linux 常用指令(Commonly Used Raspberry Pi Commands)

對於剛接觸樹莓派(Raspberry Pi)的玩家來說,從圖形介面走向「終端機(Terminal)」是核心的必經之路。Raspbian 作業系統基於 Debian Linux,因此這裡整理的指令,不僅在樹莓派上暢行無無阻,在多數的 Linux 環境中也完全通用。 本文根據筆者多年的實戰經驗,將常用的指令分為 檔案系統 、 搜尋 、 網路 以及 系統進階 四大類,方便大家隨時查閱。 一、 檔案系統與路徑管理 這是最頻繁使用的基本動作,用來在樹莓派的資料夾世界中穿梭與操控檔案。 1. 瀏覽與路徑切換 ls (List files) :列出目前路徑下的檔案與資料夾。 常用變化 : ls -al 可以連同隱藏檔、權限、檔案大小一起詳細列出。 cd (Change Directory) :切換資料夾。 常用變化 : cd .. 回到上一層; cd ~ 回到使用者的家目錄。 pwd (Print Working Directory) :顯示目前所在的工作資料夾完整路徑。 2. 資料夾與檔案操作 mkdir (Make Directory) :建立新資料夾。 範例 : mkdir project rmdir (Remove Directory) :刪除「空」的資料夾。 rm (Remove) :刪除檔案。 常用變化 : rm -rf folder_name 強制刪除整個資料夾及其所有內容(使用時請務必小心)。 cp (Copy) :複製檔案或資料夾。 範例 : cp file1.txt file2.txt (複製資料夾需加 -r )。 mv (Move) :移動檔案或資料夾,同時也常用來做「重新命名」。 範例 : mv old.txt new.txt (重新命名)。 touch :若檔案不存在則建立一個新的空檔案;若檔案已存在則更新其最後修改時間。 範例 : touch script.py 3. 讀取檔案內容 cat (Concatenate) :在終端機直接印出檔案的完整內容。 head :只顯示檔案的前幾行(預設為前 10 行)。 tail :只顯示檔案的最後幾行。 常用變化 : tail -f log.txt 可以即時監控檔案的更新,適合看 log。 4. 權限與擁有者管理 chmod (Change Mode) :修改檔案或資料夾的權限。 範...