7 陣列與搜尋 7.1 陣列 一般資料變數 宣告一維陣列 起始一維陣列 7-4

Slides:



Advertisements
Similar presentations
Divide-and-Conquer. 什麼是 divide-and-conquer ? Divide 就是把問題分割 Conquer 則是把答案結合起來.
Advertisements

6-1 指標簡介 6-2 指標與陣列 6-3 動態配置記憶體 6-4 本章綜合練習
布林代數的應用--- 全及項(最小項)和全或項(最大項)展開式
第七章 抽樣與抽樣分配 蒐集統計資料最常見的方式是抽查。這 牽涉到兩個問題: 抽出的樣本是否具有代表性?是否能反應出母體的特徵?
學習C++的基本語法 認識關鍵字與識別字的不同 學習程式碼偵錯的流程 學習如何提高程式的可讀性
: A-Sequence 星級 : ★★☆☆☆ 題組: Online-judge.uva.es PROBLEM SET Volume CIX 題號: Problem D : A-Sequence 解題者:薛祖淵 解題日期: 2006 年 2 月 21 日 題意:一開始先輸入一個.
:Word Morphing ★★☆☆☆ 題組: Problem Set Archive with Online Judge 題號: 10508:word morphing 解題者:楊家豪 解題日期: 2006 年 5 月 21 日 題意: 第一行給你兩個正整數, 第一個代表下面會出現幾個字串,
Section 1.2 Describing Distributions with Numbers 用數字描述分配.
Instructor: Ching-Chi Lin 林清池 助理教授
如何將數字變成可用之資訊 現代化資料處理與應用概念. 如何將數字變成可用之資訊 人最容易接受的訊息是圖像化資訊。 在一堆數字中,要進行比較分析,一般會使用表格形 式計算與分析。 所以一般我們會將數字依關聯性, 轉換成表格計算與分析。 此表格一般稱試算表或稱表格。 再將結果轉換為圖表,進行比較與分析。
1.1 線性方程式系統簡介 1.2 高斯消去法與高斯-喬登消去法 1.3 線性方程式系統的應用(-Skip-)
1 Web of Science 利用指引 單元二 瀏覽與處理查詢結果. 2 瀏覽檢索結果 查出的結果,預設以時間排列, 使用者可改變結果的排列方式: 還可以依被引用次數、相關度、 第一作者、刊名、出版年等排序 回到前先查的結果畫面 點選想看資料的完整書目 本館訂購範圍的期刊 全文,便可直接連結.
:New Land ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 11871: New Land 解題者:施博修 解題日期: 2011 年 6 月 8 日 題意:國王有一個懶兒子,為了勞動兒子,他想了一個 辦法,令他在某天早上開始走路,直到太陽下山前,靠.
: OPENING DOORS ? 題組: Problem Set Archive with Online Judge 題號: 10606: OPENING DOORS 解題者:侯沛彣 解題日期: 2006 年 6 月 11 日 題意: - 某間學校有 N 個學生,每個學生都有自己的衣物櫃.
第一章 變數、常數及資料型態. 變數 C 程式語言的變數名稱 第一個字必須是英文字母或底線 (_) 之後可以是數字, 英文字母或底線 (_) 不可以是保留字 例: Num (Ο) _score (Ο) C&C (X) 8num (X)
: ShellSort ★★☆☆☆ 題組: Problem D 題號: 10152: ShellSort 解題者:林一帆 解題日期: 2006 年 4 月 10 日 題意:烏龜王國的烏龜總是一隻一隻疊在一起。唯一改變烏龜位置 的方法為:一隻烏龜爬出他原來的位置,然後往上爬到最上方。給 你一堆烏龜原來排列的順序,以及我們想要的烏龜的排列順序,你.
JAVA 程式設計與資料結構 第二章 JAVA 程式基本概念及操作. 第一個程式 /* * 這是第一個程式 (FirstP.java) */ class FirstP{ public static void main(String args[]){ System.out.println("Whatever.
STAT0_sampling Random Sampling  母體: Finite population & Infinity population  由一大小為 N 的有限母體中抽出一樣本數為 n 的樣 本,若每一樣本被抽出的機率是一樣的,這樣本稱 為隨機樣本 (random sample)
: Matrix Decompressing ★★★★☆ 題組: Contest Volumes with Online Judge 題號: 11082: Matrix Decompressing 解題者:蔡權昱、劉洙愷 解題日期: 2008 年 4 月 18 日 題意:假設有一矩陣 R*C,
1. 假設以下的敘述為一未提供 “ 捷徑計算 ” 能力的程式段,試用程 式設計的技巧,使此敘述經此改 寫的動作後,具有與 “ 捷徑計算 ” 之 處理方法相同之處理模式。 if and then E1 else E2 endif.
JAVA 程式設計與資料結構 第十四章 Linked List. Introduction Linked List 的結構就是將物件排成一列, 有點像是 Array ,但是我們卻無法直接經 由 index 得到其中的物件 在 Linked List 中,每一個點我們稱之為 node ,第一個 node.
期中考參考解答 Date: 2005/12/14 Multimedia Information Systems.
MATLAB 程式設計 第 11 章 多維陣列 多維陣列的定義 在 MATLAB 的資料型態中,向量可視為 一維陣列,矩陣可視二維陣列,對於維 度 (Dimensions) 超過 1 的陣列則均可視 為「多維陣列」 (Multidimesional Arrays , 簡稱 N-D Arrays)
8.1 何謂高度平衡二元搜尋樹 8.2 高度平衡二元搜尋樹的加入 8.3 高度平衡二元搜尋樹的刪除
McGraw-Hill/Irwin © 2003 The McGraw-Hill Companies, Inc.,All Rights Reserved. 肆 資料分析與表達.
: The Playboy Chimp ★★☆☆☆ 題組: Problem Set Archive with Online Judge 題號: 10611: The Playboy Chimp 解題者:蔡昇宇 解題日期: 2010 年 2 月 28 日 題意:給一已排序的數列 S( 升冪.
第一章 演算法:效率、分析與量級 1.1演算法 1.2發展有效率演算法的重要性 1.3演算法的分析 1.4量級(Order)
Introduction to Java Programming Lecture 5: Using Java Classes : String & Math Spring 2009.
第 1 章 PC 的基本構造. 本章提要 PC 系統簡介 80x86 系列 CPU 及其暫存器群 記憶體: Memory 80x86 的分節式記憶體管理 80x86 的 I/O 結構 學習組合語言的基本工具.
Introduction to Java Programming Lecture 17 Abstract Classes & Interfaces.
: The largest Clique ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11324: The largest Clique 解題者:李重儀 解題日期: 2008 年 11 月 24 日 題意: 簡單來說,給你一個 directed.
: Happy Number ★ ? 題組: Problem Set Archive with Online Judge 題號: 10591: Happy Number 解題者:陳瀅文 解題日期: 2006 年 6 月 6 日 題意:判斷一個正整數 N 是否為 Happy Number.
: Fast and Easy Data Compressor ★★☆☆☆ 題組: Problem Set Archive with Online Judge 題號: 10043: Fast and Easy Data Compressor 解題者:葉貫中 解題日期: 2007 年 3.
第十章 再論結構. 指標與結構的關係 /* File name: ex10-1a.c */ #include int main() { struct student { char *name; int score; }; struct student st= {"Brian", 97}; struct.
: Ahoy, Pirates! ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11402: Ahoy, Pirates! 解題者:李重儀 解題日期: 2008 年 8 月 26 日 題意:有一個海盜島有 N 個海盜,他們的編號 (id)
: Multisets and Sequences ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 11023: Multisets and Sequences 解題者:葉貫中 解題日期: 2007 年 4 月 24 日 題意:在這個題目中,我們要定義.
:Nuts for nuts..Nuts for nuts.. ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 10944:Nuts for nuts.. 解題者:楊家豪 解題日期: 2006 年 2 月 題意: 給定兩個正整數 x,y.
資料結構實習-一 參數傳遞.
第六章 陣列.
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2008.
4 堆疊與佇列 4.1 前言 四種基本的資料結構 (可儲存資料的容器) 陣列 (Array)、串列(List): 最基本
: Beautiful Numbers ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 11472: Beautiful Numbers 解題者:邱經達 解題日期: 2011 年 5 月 5 日 題意: 若一個 N 進位的數用到該.
Section 4.2 Probability Models 機率模式. 由實驗看機率 實驗前先列出所有可能的實驗結果。 – 擲銅板:正面或反面。 – 擲骰子: 1~6 點。 – 擲骰子兩顆: (1,1),(1,2),(1,3),… 等 36 種。 決定每一個可能的實驗結果發生機率。 – 實驗後所有的實驗結果整理得到。
函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈, 無法停止(只能按 Ctrl-C ) 這給我們一個暗示:函式的遞迴呼叫可以 達到部分迴圈的效果.
JAVA 程式設計與資料結構 第二十章 Searching. Sequential Searching Sequential Searching 是最簡單的一種搜尋法,此演 算法可應用在 Array 或是 Linked List 此等資料結構。 Sequential Searching 的 worst-case.
資料結構實習-二.
演算法 8-1 最大數及最小數找法 8-2 排序 8-3 二元搜尋法.
845: Gas Station Numbers ★★★ 題組: Problem Set Archive with Online Judge 題號: 845: Gas Station Numbers. 解題者:張維珊 解題日期: 2006 年 2 月 題意: 將輸入的數字,經過重新排列組合或旋轉數字,得到比原先的數字大,
Chapter 10 m-way 搜尋樹與B-Tree
: Function Overloading ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 11032:Function Overloading 解題者:許智祺 解題日期: 2007 年 5 月 8 日 題意:判對輸入之數字是否為.
本章重點 2-1 有序串列(Ordered List) 2-2 介紹陣列(array) 2-3 矩陣(matrix)的應用
Probability Distribution 機率分配 汪群超 12/12. 目的:產生具均等分配的數值 (Data) ,並以 『直方圖』的功能計算出數值在不同範圍內出現 的頻率,及繪製數值的分配圖,以反應出該 機率分配的特性。
: Help My Brother ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 11033: Help My Brother 解題者: 呂明璁 解題日期: 2007 年 5 月 14 日.
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2009.
5 重複迴圈 5.1 增減運算符號 增量運算符號 減量運算符號
函式 Function 東海大學物理系‧資訊教育 施奇廷. 函式簡介 當程式越來越大、越複雜時,程式的維護、 除錯會變得更困難,此時必須引入函式來 簡化程式或將程式分段,將程式重複的部 分改寫為函式,將程式「模組化」 這種作法有下列優點:節省程式發展的時 間、邏輯容易瞭解、程式容易除錯、可分 工合作完成程式.
Visual C++重點複習.
資料結構實習-六.
1 Introduction to Java Programming Lecture 3 Mathematical Operators Spring 2008.
11 Ch05 遞迴 淡江大學 周清江 1. 2  遞迴函數乃是一個自己反覆呼叫自己的函數  一個典型的遞迴演算法 n! = n * (n-1)! = n * (n-1) * (n-2)! = n * (n-1) * (n-2) * (n-3)! = … = n * (n-1) * (n-2)
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2010.
數字系統與資料表示法 教師: 陳炯勳 數系轉換 r進制數字 稱為 base r或 radix r 有r個計數符號,計數順序逢r歸零(進位) A n A n - 1 ‥‥A 2 A 1 A 0 ﹒A -1 A -2 ‥‥A -m 其中A n 及A.
第8章 字串與陣列 8-1一維陣列的處理 8-2 字串處理 8-3 多維陣列的處理 8-4 動態陣列與參數傳遞 8-5 陣列排序與搜尋.
: Finding Paths in Grid ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11486: Finding Paths in Grid 解題者:李重儀 解題日期: 2008 年 10 月 14 日 題意:給一個 7 個 column.
:Problem E.Stone Game ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 10165: Problem E.Stone Game 解題者:李濟宇 解題日期: 2006 年 3 月 26 日 題意: Jack 與 Jim.
幼兒行為觀察與記錄 第八章 事件取樣法.
1 Introduction to Java Programming Lecture 3 Mathematical Operators Spring 2009.
第 1 章 PC 的基本構造. 本章提要 PC 系統簡介 80x86 系列 CPU 及其暫存器群 記憶體: Memory 80x86 的分節式記憶體管理 80x86 的 I/O 結構 學習組合語言的基本工具.
: How many 0's? ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 11038: How many 0’s? 解題者:楊鵬宇 解題日期: 2007 年 5 月 15 日 題意:寫下題目給的 m 與 n(m
第 8 章 記憶體指標. 8.0 變數、數值、位址 8.1 指標與變數 對 C++ 語言而言,指標( pointers )是存放 變數或陣列的位址,因此也可以藉由指標 間接取得變數或陣列中的值。 對 C++ 語言而言,指標( pointers )是存放 變數或陣列的位址,因此也可以藉由指標 間接取得變數或陣列中的值。
Presentation transcript:

7 陣列與搜尋 7.1 陣列 7-2 7.1.1 一般資料變數 7-2 7.1.2 宣告一維陣列 7-3 7.1.3 起始一維陣列 7-4 7 陣列與搜尋 7.1 陣列 7-2 7.1.1 一般資料變數 7-2 7.1.2 宣告一維陣列 7-3 7.1.3 起始一維陣列 7-4 7.1.4 宣告二維陣列 7-8 7.1.5 起始二維陣列 7-9 7.2 存取陣列 7-12 7.2.1 輸出陣列元素 7-12 7.2.2 複製陣列元素 7-15 7.2.3 清除陣列元素 7-18 7.2.4 存取陣列元素 7-22 7.3 傳遞陣列 7-24 7.3.1 傳遞陣列元素 7-24 7.3.2 傳遞陣列名稱 7-26 7.3.3 傳遞二維陣列 7-28 7.4 字串陣列 7-35 7.4.1 一維字串陣列 7-35 7.4.2 二維字串陣列 7-36 7.4.3 輸出字串陣列 7-37 7.5 排序與搜尋 7-39 7.5.1 氣泡排序 7-39 7.5.2 選擇排序 7-44 7.5.3 線性搜尋 7-47 7.5.4 二分搜尋 7-48

7.1 陣列 陣列是使用同一個變數儲存一組相同型態的資料,然後以相同的名稱但不同的註標存取陣列中個別的資料。

7.1.1 一般資料變數 宣告資料變數 int a, b, c, d, e; //宣告5個整數變數

7.1.2 宣告一維陣列 資料型態 陣列名稱[陣列長度]; 範例一 int a[5]; //宣告整數陣列 範例二 7.1.2 宣告一維陣列 資料型態 陣列名稱[陣列長度]; 範例一 int a[5]; //宣告整數陣列 範例二 char a[4], b[3], c[2]; //宣告多個字串陣列

7.1.3 起始一維陣列 資料型態 陣列名稱[陣列長度] = {初值0, 初值1, 初值2, …}; 7.1.3 起始一維陣列 資料型態 陣列名稱[陣列長度] = {初值0, 初值1, 初值2, …}; int a[10]; //宣告10空間的字元陣列 a[0] = 0; //起始a陣列第0元素 a[1] = 1; //起始a陣列第1元素 a[2] = 2; //起始a陣列第2元素 a[3] = 3; //起始a陣列第3元素 a[4] = 4; //起始a陣列第4元素 a[5] = 5; //起始a陣列第5元素 a[6] = 6; //起始a陣列第6元素 a[7] = 7; //起始a陣列第7元素 a[8] = 8; //起始a陣列第8元素 a[9] = 9; //起始a陣列第9元素

7.1.3 起始一維陣列 (續) [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] 1 2 3 4 5 6 7 7.1.3 起始一維陣列 (續) [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] 1 2 3 4 5 6 7 8 9 元素0 元素1 元素2 元素3 元素4 元素5 元素6 元素7 元素8 元素9 索引值 宣告並起始陣列元素資料 int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

7.1.3 起始一維陣列 (續) 範例一 char ascii[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; char ascii[26] = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’, //不加大括號與分號 'F', 'G', 'H', 'I', 'J', //不加大括號與分號 'K', 'L', 'M', 'N', 'O', //不加大括號與分號 'K', 'Q', 'R', 'S', 'T', //不加大括號與分號 'U', 'V', 'W', 'X', 'Y', //不加大括號與分號 'Z'}; //最後加大括號與分號

7.1.3 起始一維陣列 (續) 起始部分元素資料 範例一 7.1.3 起始一維陣列 (續) 起始部分元素資料 範例一 long value[15] = {0}; //value[0]至value[14]=0 int a[5] = {1, 2, 3}; //a[0]=1,a[1]=2,a[2]=3 //a[3]=0,a[4]=0 範例二 int errArray[5] = {1, , 3, , 5}; //錯誤

7.1.3 起始一維陣列 (續) 隱含陣列大小 int freeSize[] = {1, 4, 5, 6, 9, 4}; //freeSize陣列大小等於6 起始字串資料 char str1[4] = "C++"; //配置4個空間給str1

程式7-02:計算個人成績總和 程式輸出

7.1.4 宣告二維陣列 資料型態 陣列名稱[y長度] [x長度]; int a[3][5]; //宣告二維整數陣列

7.1.5 起始二維陣列 資料型態 陣列名稱[y長度] [x長度] = 7.1.5 起始二維陣列 資料型態 陣列名稱[y長度] [x長度] = {{初值00, 初值01, … , 初值0x}, {初值10, 初值11, … , 初值1x}, . {初值y0, 初值y1, … , 初值yx}}; 範例一 long array1[2][4] = {0}; //所有元素的啟始值為0 範例二 long array2[2][4] = {1, 2, 3, 4, 5, 6, 7, 8}; //各元素的啟始值皆不同 long x = array2[1][2] //x = 7

7.1.5 起始二維陣列 (續) 範例三 long array2[2][4] = { {1, 2, 3, 4 }, //第0列, 0, 1, 2, 3行 {5, 6, 7, 8 } //第1列, 0, 1, 2, 3行 }; //各元素的啟始值皆不同 . long x = array2[1][2] //x = 7 範例四 double array[2][4] = {{1, 2, 3 }, //第0列, 0, 1, 2, 3行 {5, 6 } //第1列, 0, 1, 2, 3行 }; // 定義部份元素啟始值 double x = array[1][0] // x = 5 double y = array[0][3] // y = 0

7.1.5 起始三維陣列 範例五 int number[3][2][4] = { 7.1.5 起始三維陣列 範例五 int number[3][2][4] = { { {1, 2, 3, 4 }, {5, 6, 7, 8 } }, //z=0 { {9, 10, 11, 12 }, {13, 14, 15, 16 } }, //z=1 { {17, 18, 19, 20 }, {21, 22, 23, 24 } } //z=2 }; . int x = number[2][0][2] //x=19

7.2 存取陣列 存取陣列包括輸出陣列元素、複製陣列元素、清除陣列元素、與存取陣列元素等等。

7.2.1 輸出陣列元素 cout << 陣列名稱[註標]; //輸出單一陣列元素 範例 7.2.1 輸出陣列元素 cout << 陣列名稱[註標]; //輸出單一陣列元素 範例 int array[6] = {1, 4, 5, 6, 9, 4} //宣告並起始整數陣列 char str[4] = “C++”; //宣告並起始字串陣列 cout << array << endl; //錯誤 cout << str << endl; //輸出字串C++ cout << array[5] << endl; //輸出第5個元素資料4 for(int i=0; i<5; i++) //輸出陣列元素迴圈 cout << array[i] << endl; //依次輸出陣列元素

7.2.2 複製陣列元素 目的陣列[註標2] = 來源陣列[註標1]; //複製單一元素 範例 7.2.2 複製陣列元素 目的陣列[註標2] = 來源陣列[註標1]; //複製單一元素 範例 int iSource[6] = {1, 4, 5, 6, 9, 4} //宣告並起始整數陣列 int iTarget[6]; //宣告整數陣列 char cSource[4] = "C++"; //宣告並起始字串陣列 char cTarget[4]; //宣告字串陣列 iTarget = iSource; //錯誤 cTarget = cSource; //複製字串C++ iTarget[3] = iSource[4]; //複製後iTarget[3] = 9 for(int i=0; i<5; i++) //複製陣列元素迴圈 iTarget[i] = iSource[i]; //依次複製陣列元素

7.2.3 清除陣列元素 陣列名稱[註標] = 新值; //指定單一陣列元素 範例 7.2.3 清除陣列元素 陣列名稱[註標] = 新值; //指定單一陣列元素 範例 int array[6] = {1, 4, 5, 6, 9, 4} //宣告,起始整數陣列 char str[4] = “C++”; //宣告,起始字串陣列 array[6] = {0}; //錯誤 str = ""; //清除C++ array[4] = 0; //清除array[4] = 0 for(int i=0; i<5; i++) //複製陣列元素迴圈 iTarget[i] = iSource[i]; //依次複製陣列元素

7.2.4 存取陣列元素 指定陣列元素就是存入陣列元素的動作。 輸出陣列元素則是取得陣列元素的方式之一。

Ex 13 寫一C++程式,宣告一個陣列變數來存放骰子每一點數出現的次數。 以亂數擲10000次骰子然後計算並列出出現1、2 、 3 、 4 、 5 、 6點的次數。

7.3 傳遞陣列 傳遞陣列元素相當於傳遞變數數值(pass-by-value using a variable),傳遞陣列名稱則相當於傳遞變數位址(pass-by-reference)。 實際上是傳遞陣列指標(pass-by-reference using pointer)

7.3.1 傳遞陣列元素 函數名稱(陣列名稱[索引值]); //呼叫函數 . . 傳回型態 函數名稱(參數型態 參數名稱) //定義函數 { //函數本體; } 範例 int source[3] = {5, 9, 3}; showArray(source[0]); //傳遞單一元素給函數 void showArray(int var) //函數,參數為單一變數 { cout << var << endl; //輸出source[0] }

7.3.2 傳遞陣列名稱 函數名稱(陣列名稱); //呼叫函數 . . 傳回型態 函數名稱(參數型態 參數名稱[]) //定義函數 { //函數本體; } 範例 int source[3] = {5, 9, 3}; showArray(source); //呼叫showArray函數 void showArray(int array[]) { //函數,參數為整個陣列 for (int i=0; i<=2; i++) //輸出迴圈 cout << array[i] << endl; //依序輸出source陣列元素 }

執行結果

7.3.3 傳遞二維陣列 函數名稱(陣列名稱); //呼叫函數 . . 傳回型態 函數名稱(參數型態 參數名稱[][長度]) //定義函數 { //函數本體; }

7.3.3 傳遞二維陣列 (續) 範例 int eq[3][3] = { {7, 1, 3}, {4, -1, 1}, 7.3.3 傳遞二維陣列 (續) 範例 int eq[3][3] = { {7, 1, 3}, {4, -1, 1}, {5, 3, -2} }; //宣告並起始二維陣列 dy = calArray(eq); //dy=calArray傳回值 int calArray(int array[][3]) { //函數,參數為二維陣列 int a = 0; for(int i=0; i<3; i++) { //計算行列式值迴圈 a += array[0][i]*array[1][(i+1)%3]*array[2][(i+2)%3]; a -= array[0][i]*array[1][(i+2)%3]*array[2][(i+1)%3]; } return a; //傳回計算值

Exercise 14 寫一個函數,參數是一個陣列,函數會將陣列中,第0和第1個陣列元素之中較大值的元素傳回。 寫一個主程式,宣告一個陣列,請使用者輸入陣列第0和第1個陣列元素的值,以此陣列為參數呼叫函數,並將函數回船的較大值印出。

7.5 排序與搜尋 一般而言,搜尋就是在資料庫中找尋我們所要的資料。而搜尋前會先將資料庫(存放在磁碟或光碟)的資料載入到記憶體中,想當然是使用陣列來管理相當多筆的資料,所以本節就是討論如何在陣列中搜尋相符的資料,搜尋方法包括線性搜尋與二分搜尋。 使用二分搜尋之前,必須先排序資料。排序就是由小到大排列資料或是由大到小排列資料。本節將討論的排序方法包括氣泡排序與選擇排序。

7.5.1 氣泡排序 氣泡排序(bubble sort)是利用兩兩互相比較原理,例如有5個元素則共比較4+3+2+1=10次。方法是依序比較,例如01, 02, 03, 04, 12, 13, 14, 23, 24, 34共10次。從01, 02, 03, 04可找到最小值,從12, 13, 14可以找到第二小值,從23, 24可找到第三小值,從34可找到第四小值與最大值。 氣泡排序方式原理雖然簡單,但適用於資料筆數較少時。如果使用氣泡排序來排列很多筆資料時,雖然不會要電腦的命,但使用者會等得不耐煩。

7.5.1 氣泡排序 (續) 第一步驟:如下圖是第0元素與第1元素比較,然後將較小值放在第0元素,較大值放在第1元素。例如57與19比較,則將19存入第0元素,57存入第1元素。

7.5.1 氣泡排序 (續) 第二步驟:比較第0元素與第2元素,然後將較小值放在第0元素,較大值放在第2元素。如下圖比較19與33,然後將19存入第0元素,33存入第2元素。

7.5.1 氣泡排序 (續) 第三步驟:比較第0元素與第3元素,然後將較小值放在第0元素,較大值放在第3元素。如下圖比較19與92,然後將19存入第0元素,92存入第3元素。

7.5.1 氣泡排序 (續) 第四步驟:比較第0元素與第4元素,然後將較小值放在第0元素,較大值放在第4元素。如下圖比較19與6,然後將6存入第0元素,19存入第4元素。

7.5.1 氣泡排序 (續) 第五步驟:比較第0元素與所有其他元素後,已經找到最小值並存在第0元素中。接下來,比較第1元素與第2元素,然後將較小值放在第1元素,較大值放在第2元素。如下圖比較57與33,然後將33存入第1元素,57存入第3元素。

7.5.1 氣泡排序 (續) 第六步驟:比較第1元素與第3元素,然後將較小值放在第1元素,較大值放在第3元素。如下圖比較33與92,然後將33存入第1元素,92存入第3元素。

7.5.1 氣泡排序 (續) 第七步驟:比較第1元素與第4元素,然後將較小值放在第1元素,較大值放在第4元素。如下圖比較33與19,然後將19存入第1元素,33存入第4元素。

7.5.1 氣泡排序 (續) 第八步驟:第1元素與2, 3, 4元素比較後,已經找到第二小值並存在第1元素中。接下來,比較第2元素與第3元素,然後將較小值放在第2元素,較大值放在第3元素。如下圖比較57與92,然後將57存入第2元素,92存入第3元素。

7.5.1 氣泡排序 (續) 第九步驟:比較第2元素與第4元素,然後將較小值放在第2元素,較大值放在第4元素。如下圖比較57與33,然後將33存入第2元素,57存入第4元素。

7.5.1 氣泡排序 (續) 第十步驟:第2元素與3, 4元素比較後,已經找到第三小值並存在第2元素中。在下來,比較第3元素與第4元素比較,然後將較小值放在第3元素,較大值放在第4元素。例如92與57比較如下圖,然後將57存入第3元素,92存入第4元素。

7.5.1 氣泡排序 (續) 經過氣泡排序後,陣列中的資料由小到大排列如下。

7.5.1 氣泡排序 (續) 範例 for (counti = 0; counti < max-1; counti++) 7.5.1 氣泡排序 (續) 範例 for (counti = 0; counti < max-1; counti++) for (countj = counti+1; countj < max; countj++) if (number[counti] > number[countj]) { //若須要則對調 buffer = number[counti]; number[counti] = number[countj]; number[countj] = buffer; }

7.5.3 線性搜尋 線性搜尋(linear search)又稱為循序搜尋(sequential search),通常利用迴圈逐一比對要搜尋的資料,若相等則表示找到而且中斷迴圈,若全部都不等則表示找不到。

7.5.3 線性搜尋 (續) 範例 for (count = 0; count <= 4; count++) //找尋資料迴圈 { 7.5.3 線性搜尋 (續) 範例 for (count = 0; count <= 4; count++) //找尋資料迴圈 { if (number[count] == search) //若資料==緩衝器值 flag = 1; }

7.5.4 二分搜尋 二分搜尋(binary search)使用二分搜尋法之前必須先將資料排序,計算搜尋上限與下限的中間項,然後比較中間項與搜尋資料。

7.5.4 二分搜尋 (續) 若中間項小於搜尋資料則搜尋上限=中間項-1,然後繼續搜尋下一個中間項如下圖

7.5.4 二分搜尋 (續) 若中間項大於搜尋資料則搜尋下限=中間項+1,然後繼續搜尋下一個中間項如下圖

7.5.4 二分搜尋 (續) 範例 do //搜尋迴圈 { if ((low + high) % 2 > 0.5) //計算搜尋位置 7.5.4 二分搜尋 (續) 範例 do //搜尋迴圈 { if ((low + high) % 2 > 0.5) //計算搜尋位置 middle = (low + high) / 2 + 1; else middle = (low + high) / 2; if (search < number[middle]) //計算搜尋上限 high = middle - 1; else if (search > number[middle]) //計算搜尋下限 low = middle + 1; else if (search == number[middle]) //找到相符數值 break; } while (low <= high);

Exercise 15 P. 7-51 第9題 寫一C++程式,找尋下列各數中的最大值與最小值。 120, 92, 351, 66, 1024, 964, 47, 539, 76, 33, 88, 524, 67, 1000, 666, 737, 25, 999, 373

Homework 6 寫一C++程式,請使用者輸入兩個2*2矩陣,執行兩個2*2矩陣相乘的運算,然後輸出兩個矩陣與運算結果的矩陣。 例如: