第8章 字串與陣列 8-1 字串處理 8-2 一維陣列的處理 8-3 建立多維陣列 8-4 不規則陣列與參數傳遞 8-5 陣列排序與搜尋.

Slides:



Advertisements
Similar presentations
C# 程序设计实验. Your site here LOGO 实验一 实验一.NET Framework 编程入门 和控制语句编写 实验目的: 熟悉 visual studio2010 的开发环境,理解 C# 程序语法 结构,掌握顺序结构、选择结构和循环结构语法的程序 设计方法,编写控制语句和数组程序。
Advertisements

藥物濫用 華德學校上午校 黃秀雯.
硕士论文开题报告 煤炭企业物流信息系统的 研究与设计 指导老师: 学生姓名: 学 号:
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Introduction 基本概念 授課老師:蕭志明
第 九 章 搜尋(Search) 課程名稱:資料結構 授課老師:_____________.
主讲:计算机工程学院 李兰 答疑地点:主教学楼B区213
四資二甲 第三週作業 物件導向程式設計.
AI人工智慧報告 黑白棋 班級:資工四乙 學號:498G0009 姓名:盧冠妤.
第7章 C#函數與.NET Framework類別函數庫
第五章 字符串.
TQC+ 物件導向程式認證-JAVA.
補充: Input from a text file
第三章 控制结构.
第五章 数组.
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
程設一.
BLANK overview.
CH2 開發環境介紹 最簡單的互動設計 – Arduino一試就上手 孫駿榮、吳明展、盧聰勇.
控制流程 邏輯判斷 迴圈控制.
第16章 Windows Form與資料繫結 16-1 資料繫結的基礎 16-2 在專案新增資料來源 16-3 使用資料來源建立單筆編輯表單
第二章 C# 基础知识.
流程控制結構 4-1 流程控制與UML活動圖 4-2 程式區塊與主控台基本輸入 4-3 條件控制敘述 4-4 迴圈控制敘述 4-5 巢狀迴圈
排序 Sorting.
快速排序法 (Quick Sort).
1、基本概念 2、插入排序 3、交换排序 4、选择排序 5、归并排序 6、基数排序 7、外部排序
第 7 章 陣列 (Array).
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
搜尋資料結構 Search Structures.
第七章 搜索结构 静态搜索结构 二叉搜索树 AVL树.
第12章 樹狀搜尋結構 (Search Trees)
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
程式撰寫流程.
第14章 伺服器檔案、電子郵件處理與Ajax 14-1 資料夾與檔案操作 14-2 文字檔案的讀寫 14-3 電子郵件與附檔處理
條件判斷指令 -if 指令 -switch 指令 迴圈指令 - for 迴圈 - while迴圈 - break、continue 指令
PHP 程式流程控制結構.
4.1 一維陣列 4.2 for(:) 迴圈 4.3 動態陣列 4.4 二維陣列 4.5 非矩形陣列
第7章 Web伺服器檔案與XML文件的處理 7-1 System.IO名稱空間的基礎 7-2 伺服器的資料夾與檔案操作
丙級電腦軟設-VB程式設計 資料來源:林文恭研究室 整理:張福生.
第4章 常量和变量 常量和变量都是程序中预留的用于保存数据的内存空间。常量的值在程序运行过程中始终不会发生变化。而变量的值在程序的运行过程中是可以变化的。在Fortran语言中,有五种基本的数据类型可供使用。他们分别是整型(INTEGER)、实型(REAL)、复型(COMPLEX)、字符型(CHARACTER)和逻辑型(LOGICAL)。按用途,又可以分数值型、字符型和逻辑型三种。相应的常量和变量也可以分为这三种。本章将按照用途介绍常量和变量的基本概念。
第四章串 4.1 串类型定义 4.2 串的表示和实现 4.3 串的模式匹配算法 4.4 串操作应用举例.
第四章 串.
Ch02-基礎語法.
樹 2 Michael Tsai 2013/3/26.
Chapter 5 Recursion.
第三章 C# 基础知识.
第7章 陣列與指標 7-1 陣列的基礎 7-2 一維陣列的處理 7-3 二維與多維陣列的處理 7-4 陣列的函數參數
第7章 繼承/多型/介面 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
第 14 章 輸出與輸入.
第3章 Java語法的JSP程式 3-1 Java語言的基礎 3-2 JSP程式的基本架構 3-3 Java的變數與資料型態
鄧姚文 資料結構 第一章:基本概念 鄧姚文
鄧姚文 資料結構 第五章:遞迴 鄧姚文
Ch04 VB.NET的流程控制 網頁程式設計.
第五章 介面/集合/泛型 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.
补充:c#语言基础.
第九章 排序 概述 插入排序 快速排序 交换排序(起泡排序) 选择排序 归并排序.
第二章 Java基本语法 讲师:复凡.
Lucene 算法介绍 IR-Lab 胡晓光.
第6章 運算式與運算子 [算術與多功能計算機]
字符串 (String) 字符串是 n (  0 ) 个字符的有限序列, 记作 S = “c1c2c3…cn” 其中,S 是串名字
第二章 Java语法基础.
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
迴圈(重複性結構) for while do while.
C#快速導讀 流程控制.
C++程序语言设计 Chapter 14: Templates.
第10章 二元搜尋樹 (Binary Search Tree)
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
Presentation transcript:

第8章 字串與陣列 8-1 字串處理 8-2 一維陣列的處理 8-3 建立多維陣列 8-4 不規則陣列與參數傳遞 8-5 陣列排序與搜尋

8-1 字串處理 8-1-1 字串的基礎 8-1-2 字串長度與大小寫轉換 8-1-3 插入、刪除、取出和連接字串 8-1-4 子字串的搜尋、取代與比較

8-1-1 字串的基礎-說明 C#語言內建的string資料型別就是.NET Framework中System.String類別的別名。在C#程式碼可以使用文字值的字串(一組char字元集合使用「"」號括起)來建立字串物件,如下所示: string str = "C#程式設計"; string str1; str1 = "ASP.NET網頁設計"; 上述程式碼建立str和str1字串且指定字串內容。

8-1-1 字串的基礎-參考資料型別 C#語言的字串是一種參考資料型別,所以字串內容並不能更改,也就是說,一旦建立字串後,就無法改變其值,只能重新指定成新的字串值或另一個字串變數,如下所示: string str = "C#程式設計"; str = "ASP.NET網頁設計";

8-1-1 字串的基礎-運算子 (字串連接運算子) 字串連接運算子可以連接兩個運算元的字串成為一個字串,也就是將第2個運算元的字串附加在第1個運算元的最後,如下所示: string str = "good " + "morning"; 上述程式碼使用「+」號連接兩個字串,所以str變數的值成為"good morning"。

8-1-1 字串的基礎-運算子 (比較運算子) 雖然string資料型別是一種參考資料型別,但是,C#比較運算子(例如:「==」和「!=」)比較的是string 物件的值,而不是參考的位址,如下所示: string str1 = "book"; string str2 = "book"; if ( str1 == str2 ) { … } 上述if條件是比較str1和str2字串的值,所以結果為true。

8-1-1 字串的基礎-運算子 ([]運算子) string str = "test"; char c = str[2]; []運算子可以如同陣列(詳細的說明請參閱<第8-2節:一維陣列的處理>)一般,從字串中取出指定位置的字元,如下所示: string str = "test"; char c = str[2]; 上述程式碼可以取出第3個字元([]運算子的位置是從0起算),即's'。

8-1-2 字串長度與大小寫轉換-屬性 String物件提供相關屬性可以取得字串長度,其範例和說明如下表所示:

8-1-2 字串長度與大小寫轉換-方法 英文字串內容大小寫轉換和刪除空白字元的相關方法說明與範例,如下表所示:

8-1-2 字串長度與大小寫轉換-Visual C#專案 Visual C#專案:Ch8_1_2 在Windows應用程式的TextBox控制項輸入字串後,即可按下按鈕取得字串長度、轉換成小寫和刪除空白字元,如下圖所示:

8-1-3 插入、刪除、取出和連接字串-說明 String物件提供方法可以插入、刪除、取出和連接字串,其相關方法的說明與範例,如下表所示:

8-1-3 插入、刪除、取出和連接字串- Visual C#專案 Visual C#專案:Ch8_1_3 在Windows應用程式輸入字串、起始位置和長度後,選取字串方法即可取出所需的子字串,如下圖所示:

8-1-4 子字串的搜尋、取代與比較- 子字串的搜尋 在String物件提供子字串搜尋方法,可以在字串中搜尋所需的子字串。其相關方法的說明與範例,如下表所示:

8-1-4 子字串的搜尋、取代與比較- 取代子字串 String物件的Replace()方法只能取代字串中的字元,並不能取代子字串,我們可以自行使用Substring()方法來建立字串取代功能。例如:找到子字串是位在搜尋字串output的位置pos,其長度為len,如下所示: output = txtInput.Text; strLeft = output.Substring(0, pos); strRight = output.Substring(pos + len); txtInput.Text = strLeft + txtReplace.Text + strRight; 取代的字串運算式,如下所示: 原始字串 = [右字串] + [子字串] + [左字串] 取代字串 = [右字串] + [取代字串] + [左字串]

8-1-4 子字串的搜尋、取代與比較- 字串比較 String物件的字串比較是一個字元一個字元比較字元的內碼值,直到分出大小為止。其相關方法的說明與範例,如下表所示:

8-1-4 子字串的搜尋、取代與比較- Visual C#專案 Visual C#專案:Ch8_1_4 在Windows應用程式使用字串方法來建立類似文書編輯工具的搜尋和取代功能,如下圖所示:

8-2 一維陣列的處理 8-2-1 陣列的基礎 8-2-2 宣告一維陣列 8-2-3 foreach迴圈與System.Array類別 ViLLE – 5.1 宣告一維陣列 8-2-3 foreach迴圈與System.Array類別

8-2-1 陣列的基礎-說明 「陣列」(Arrays)是一種程式語言的基本資料結構,屬於一種循序性的資料結構。日常生活最常見的範例是一排信箱,如下圖所示:

8-2-1 陣列的基礎-為何使用陣列 string name1, name2, name3, name4, name5; 如果程式需要使用很多相同型別的變數時,我們可以宣告一堆變數。例如:大樓的住戶名稱,如下所示: string name1, name2, name3, name4, name5; 上述程式碼宣告5個字串變數name1~5,使用不同名稱來區分各住戶。如果使用陣列變數,只需要宣告一個陣列變數,如下所示: string[] name = new string[5]; 上述程式碼宣告一個一維陣列變數,只需使用陣列變數名稱加上索引值,就可以存取指定陣列元素的值。

8-2-1 陣列的基礎-C#陣列 C#語言的陣列是對應.NET Framewok的System.Array類別,它是一種參考資料型別,可以將相同資料型別的變數集合起來,使用一個名稱來代表,以索引值存取元素,每一個元素相當於是一個變數,如下圖所示:

8-2-2 宣告一維陣列-語法 陣列是一組變數,如果在程式中需要使用很多相同資料型別的變數時,我們可以直接宣告陣列,而不用宣告一堆變數,然後透過陣列索引來存取陣列元素的值。 C#陣列在宣告時就需指定陣列大小的尺寸,其宣告語法如下所示: 資料型別[] 陣列_名稱 = new 資料型別[尺寸];

8-2-2 宣告一維陣列-範例 例如:宣告和建立字串陣列names[],如下所示: string[] names = new string[5]; 上述陣列的大小為5,索引值範圍是從0起算至括號值減一的4。

8-2-2 宣告一維陣列-指定一維陣列的初值 在宣告陣列的同時,就可以一併指定陣列元素的初值,如下所示: int[] grades = {98, 75, 56, 88, 67}; 或 string[] names = new string[5] {"陳會安", "江小魚", "陳允傑", "楊過", "小龍女"};

8-2-2 宣告一維陣列-存取一維陣列的元素 如果陣列沒有指定初值,我們可以使用指定敘述來指定陣列值,如下所示: names[0] = "陳會安"; names[1] = "江小魚"; names[2] = "陳允傑"; names[3] = "楊過"; names[4] = "小龍女"; 取出陣列值的程式碼,如下所示: myName = names[2]; myGrade = grades[2];

8-2-2 宣告一維陣列-Visual C#專案 Visual C#專案:Ch8_2_2 在Windows應用程式建立學生姓名字串陣列和成績的整數陣列,學號就是陣列索引值,只需輸入學號的索引值,就可以取得陣列元素值,即學生姓名和成績,如下圖所示:

ViLLE – 5.1 宣告一維陣列 請啟動ViLLE,在【五. 陣列】目錄下,選【1. 宣告一維陣列】,按【Run】鈕模擬執行此範例程式,如下圖所示:

8-2-3 foreach迴圈與System.Array類別- 走訪陣列(語法) foreach迴圈和for迴圈敘述十分相似,不過foreach迴圈通常是使用在集合物件或陣列,可以顯示集合物件或陣列的所有元素,特別適合在不知道有多少元素的集合物件或陣列時,其基本語法如下所示: foreach ( 變數 in 陣列 ) { 程式敘述; }

8-2-3 foreach迴圈與System.Array類別- 走訪陣列(範例) 例如:走訪一維陣列grades[]來計算總分,如下所示: foreach (int element in grades) { sum += element; } 上述變數grades[]為陣列,迴圈可以一一取出所有的陣列元素,指定給變數element,請注意!element變數是在foreach迴圈敘述中宣告。

8-2-3 foreach迴圈與System.Array類別- System.Array方法(說明) C#陣列就是System.Array類別的物件,如果使用for、while或do/while迴圈存取陣列元素,可以搭配System.Array類別的方法來取得陣列邊界,其相關方法的說明,如下表所示:

8-2-3 foreach迴圈與System.Array類別- System.Array方法(範例) low = grades.GetLowerBound(0); high = grades.GetUpperBound(0); for ( index = low; index <= high; index++ ) { output += names[index] + "\t" + grades[index] + "\r\n"; }

8-2-3 foreach迴圈與System.Array類別- Visual C#專案 Visual C#專案:Ch8_2_3 在Windows應用程式按下按鈕,就可以顯示學生姓名、成績、所有學生成績的平均和總分,如下圖所示:

8-3 建立多維陣列-說明 「二維陣列」(Two-dimensional Array)或多維陣列都是一維陣列的擴充。如果將一維陣列想像成一度空間的線,二維陣列就是二度空間的平面,三維陣列即空間。 在日常生活中的二維陣列應用非常廣泛,只要是平面的表格,都可以轉換成二維陣列來表示。例如:月曆、功課表和成績單等。

8-3 建立多維陣列-宣告二維陣列 C#語言的多維陣列擁有多個索引,對比前述信箱就是多排信箱。例如:儲存學生成績的二維陣列,其宣告如下所示: int[,] grades = new int[2,3]; 或 int[,] grades = new int[2,3] { { 54, 68, 93}, { 67, 78, 89}}; 上述程式碼宣告一個2列和3欄的2x3二維陣列grades[,],使用「,」逗號分隔索引,1個逗號是二維;2個就是三維陣列。

8-3 建立多維陣列-指定元素值 在宣告2x3的二維陣列後,如果沒有指定元素初值,我們可以使用指定敘述來指定二維陣列的元素值,如下所示: grades[0,0] = 54; grades[0,1] = 68; grades[0,2] = 93; grades[1,0] = 67; grades[1,1] = 78; grades[1,2] = 89;

8-3 建立多維陣列-圖例 二維陣列擁有2個索引,左索引(Left Index)指出元素位在哪一列,右索引(Right Index)指出位在哪一欄,使用2個索引值就可以存取指定的二維陣列元素。

8-3 建立多維陣列-走訪二維陣列 在建立二維陣列且指定元素值後,走訪二維陣列需要是使用二層巢狀迴圈,如下所示: for (i = 0; i <= 1; i++) for (j = 0; j <= 2; j++) sums[i] += grades[i, j];

8-3 建立多維陣列-Visual C#專案 Visual C#專案:Ch8_3 在Windows應用程式輸入學生的各科成績後,就可以計算學生的總分和平均分數,如下圖所示:

8-4 不規則陣列與參數傳遞 8-4-1 不規則陣列 8-4-2 傳遞字串與陣列參數 ViLLE – 5.3 傳遞陣列參數

8-4-1 不規則陣列-說明 在C#語言的多維陣列支援不規則陣列,也就是在多維陣列的每一維可以不定大小,簡單的說,陣列元素不只可以是變數值,還可以是另一個陣列。 C#語言的不規則陣列(Jagged Array)是讓陣列元素可以是另一個陣列,換句話說,二維陣列的第1維元素值是另一個一維陣列,而且可以是不同尺寸的一維陣列。

8-4-1 不規則陣列-宣告 在C#程式碼宣告不規則陣列的語法和之前的二維陣列有一些不同,每一維陣列是一個「[]」;二維就是「[][]」。例如:因為每一班學生人數並不相同,所以我們準備宣告儲存3個班級學生姓名的不規則陣列,如下所示: string[][] classes = new string[3][]; classes[0] = new string[2]; classes[1] = new string[3]; classes[2] = new string[2];

8-4-1 不規則陣列-指定元素值 然後就可以使用指定敘述來指定元素值,如下所示: classes[0][0] = "陳會安";

8-4-1 不規則陣列- 不規則陣列的初值 在宣告不規則陣列時,我們可以在建立元素陣列時指定初值,如下所示: string[][] classes = new string[3][]; classes[0] = new string[] {"陳會安", "江小魚"}; classes[1] = new string[] {"張無忌", "楊過", "小龍女"}; classes[2] = new string[] {"陳允傑", "陳允東"}; 在宣告二維的不規則陣列時就指定初值,如下所示: string[][] classes = new string[][] { new string[] {"陳會安", "江小魚"}, new string[] {"張無忌", "楊過", "小龍女"}, new string[] {"陳允傑", "陳允東"} };

8-4-1 不規則陣列- 走訪不規則陣列 在建立二維的不規則陣列後,走訪二維不規則陣列也是使用二層巢狀迴圈,我們需要使用GetLength()方法來取得每一維的陣列尺寸,如下所示: for (i = 0; i < classes.GetLength(0); i++) { for (j = 0; j < classes[i].GetLength(0); j++) output += classes[i][j] + "\t"; output += "\r\n"; }

8-4-1 不規則陣列- Visual C#專案 Visual C#專案:Ch8_4_1 在Windows應用程式測試C#不規則陣列,我們準備建立不規則陣列儲存三個班的學生姓名資料,因為每一班的學生數不同,最後顯示每一班的學生清單,如下圖所示:

8-4-2 傳遞字串與陣列參數-說明 C#函數的參數如果是字串或陣列,因為字串與陣列都屬於參考資料型別,此時傳值和傳址參數(或傳出參數)的差異,如下表所示:

8-4-2 傳遞字串與陣列參數-陣列參數 例如:在C#函數中使用指定敘述將參數指定成其他陣列,如下所示: public void replace(int[] a) { int[] b = {10, 20, 30}; a = b; ……… } 函數將參數的陣列a指定成新陣列b,並不會影響原參數陣列a,因為傳值方式並不能將參數指定成新陣列。

8-4-2 傳遞字串與陣列參數-字串參數 雖然字串也是參考資料型別,不過,因為字串並不能更改字元(成員)。如果字串內容變更,C#語言是建立一個新字串(變數本身),換句話說,傳值參數並無法更改字串內容,如果函數需要更改字串內容,請使用傳址參數來傳遞。

8-4-2 傳遞字串與陣列參數-Visual C#專案 Visual C#專案:Ch8_4_2 在Windows應用程式建立最大值和字串取代函數,可以取得陣列最大值和取代字串,函數參數是使用傳值方式來傳遞陣列,字串則是使用傳址方式呼叫,如下圖所示:

ViLLE – 5.3 傳遞陣列參數 請啟動ViLLE,在【五. 陣列】目錄下,選【3. 傳遞陣列參數】,按【Run】鈕模擬執行此範例程式,如下圖所示:

8-5 陣列排序與搜尋 8-5-1 陣列的排序 8-5-2 陣列的搜尋

8-5-1 陣列的排序-基礎 排序工作是將一些資料依照特定原則排列成遞增或遞減的順序。例如:整數陣列data[]的內容,如下所示: data[0]=89 data[1]=34 data[2]=78 data[3]=45 上述陣列以整數值的大小,將陣列內容依遞增的順序來排序。其排序結果如下所示: data[0]=34 data[1]=45 data[2]=78 data[3]=89 上述陣列data[]已經完成排序,其大小順序如下所示: data[0] < data[1] < data[2] < data[3]

8-5-1 陣列的排序-泡沫排序法(說明) 泡沫排序法(Bubble Sort)是使用交換方式來進行排序,可以將較小元素逐漸移動至陣列開始,較大元素慢慢浮向陣列的最後,如同水缸中的泡沫,慢慢往上浮,故稱為泡沫排序法。

8-5-1 陣列的排序-泡沫排序法(過程) 泡沫排序法的排序過程是使用交換方法,在陣列中找尋最大值,例如:原始陣列內容,如下: data[0]=89 data[1]=34 data[2]=78 data[3]=45 陣列依序比較陣列元素0和1,元素1和2,元素2和3,如果各組的第1個元素比較大,就交換元素,如下所示: data[0]=89 > data[1]=34 => data[0]=34 data[1]=89 交換 data[1]=89 > data[2]=78 => data[1]=78 data[2]=89 交換 data[2]=89 > data[3]=45 => data[2]=45 data[3]=89 交換 陣列的最大值89一步步往陣列尾端移動。完成後,陣列索引3的元素是最大值。接著重複上述步驟,每次縮小1個元素後,再重新比較陣列元素,可以完成陣列元素的排序。

8-5-1 陣列的排序-泡沫排序法(函數) public void bubble(int[] data) { int i, j, len, temp; len = data.GetUpperBound(0); for (i = len; i >= 0; i--) for( j = 0; j <= (len-1); j++ ) if ( data[j + 1] < data[j] ) temp = data[j + 1]; // 交換 data[j + 1] = data[j]; data[j] = temp; }

8-5-1 陣列的排序-Visual C#專案 Visual C#專案:Ch8_5_1 在Windows應用程式輸入4個數字,按下按鈕可以將4個數字從小到大進行排序,如下圖所示:

8-5-2 陣列的搜尋-基礎 搜尋是在資料中找出是否存在與鍵值相同的資料,如果資料存在,就進行後續的資料處理。例如:查尋電話簿是為了找朋友的電話號碼,然後與他連絡。在書局找書也是為了找到後買回家閱讀。 搜尋方法依照搜尋的資料分為兩種,如下所示: 沒有排序的資料:針對沒有排序的資料執行搜尋,我們需要從資料的第1個元素開始比較,從頭到尾以確認資料是否存在。 已經排序的資料:因為資料已經排序,所以搜尋就不需從頭開始一一比較。例如:在電話簿找電話,相信沒有人是從電話簿的第1頁開始找,而是直接從姓名出現的頁數開始找,因為電話簿已經依照姓名進行排序。

8-5-2 陣列的搜尋-線性搜尋法 線性搜尋法(Sequential Search)是從陣列的第1個元素開始走訪整個陣列,然後一個一個比較是否擁有搜尋的鍵值,因為需要走訪整個陣列,陣列資料是否排序都無所謂。 換句話說,在C#程式可以使用迴圈來走訪陣列,以便一一比較陣列元素是否有指定的鍵值,如下所示: for (i = 0; i <= len; i++) if ( key == data[i] ) { lblOutput.Text = "找到鍵值在位置: " + i; isFound = true; break; }

8-5-2 陣列的搜尋-二元搜尋法 二元搜尋法(Binary Search)是一種分割資料的搜尋方法,搜尋資料是已經排序的資料。二元搜尋法先檢查排序資料的中間元素,如果等於鍵值就是找到;如果小於鍵值,表示資料在前半段;否則在後半段。然後繼續分割半段資料來重覆上述操作,直到找到或已經沒有資料可以分割為止。 例如:data[]陣列索引的上下範圍分別是low和high,中間元素mid是(low + high)/2。在執行二元搜尋時分成三種情況,如下所示: 搜尋鍵值小於陣列的中間元素:鍵值在資料陣列的前半部。 搜尋鍵值大於陣列的中間元素:鍵值在資料陣列的後半部。 搜尋鍵值等於陣列的中間元素:找到搜尋的鍵值。

8-5-2 陣列的搜尋-二元搜尋法程式碼 do { mid = (low + high) / 2; if ( data[mid] == key ) lblOutput.Text = "找到鍵值在位置: " + mid; isFound = true; break; } else if ( data[mid] > key ) high = mid - 1; // 前半段 low = mid + 1; // 後半段 } while ( low <= high );

8-5-2 陣列的搜尋-Visual C#專案 Visual C#專案:Ch8_5_2 在Windows應用程式建立線性和二元搜尋,可以在陣列執行搜尋,因為二元搜尋需要已排序資料,所以提供上一節泡沫排序法來排序陣列資料,如下圖所示:

End