資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.

Slides:



Advertisements
Similar presentations
第 8 章 数组 计算机科学学院 李淮 Tel QQ
Advertisements

《C语言程序设计》复习
Introduction 基本概念 授課老師:蕭志明
資料結構與演算法 課程教學投影片.
第 九 章 搜尋(Search) 課程名稱:資料結構 授課老師:_____________.
第八章 查找.
C语言基础——指针的高级应用 Week 05.
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
第8章 查找 数据结构(C++描述).
第8章 字串與陣列 8-1 字串處理 8-2 一維陣列的處理 8-3 建立多維陣列 8-4 不規則陣列與參數傳遞 8-5 陣列排序與搜尋.
第九章 指针 目录 指针与指针变量的概念 变量的指针和指向变量的指针变量 数组的指针和指向数组的指针变量
課程名稱:資料結構 授課老師:_____________
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
C语言程序设计 第十二章 位运算.
第5章 函数与模块化设计 学习目的与要求: 掌握函数的定义及调用方法 理解并掌握参数的传递方法 理解函数的嵌套与递归调用
C语言程序设计 课程 第5章 数组 主讲:李祥 博士、副教授 单位:软件学院软件工程系.
高级语言程序设计 主讲人:陈玉华.
第一章 C语言概述.
物件導向程式設計 (Object-Oriented rogramming)
選擇排序法 通訊一甲 B 楊穎穆.
第11章 查找 主要知识点 查找的基本概念 静态查找表 动态查找表 哈希表.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
排序 Sorting.
第9章 排序.
第十章 排序與搜尋.
If … else 選擇結構 P27.
第 7 章 陣列 (Array).
搜尋資料結構 Search Structures.
第七章 搜索结构 静态搜索结构 二叉搜索树 AVL树.
第12章 樹狀搜尋結構 (Search Trees)
程式撰寫流程.
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
第九章 查找 2018/12/9.
C语言 程序设计基础与试验 刘新国、2012年秋.
Sorting 排序 Bubble Sort O(n2) Insert Sort Selection Sort Quick Sort
第九章 查找 2019/2/16.
第三章 进程互斥与同步.
第8章 資料排序 資料結構設計與C++程式應用
第九章 排序 概述 插入排序 快速排序 交换排序(起泡排序) 选择排序 归并排序.
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
Main() { Dfas Asdfasf fasdfa } #include <stdio.h> void main( ) {
函式庫補充資料.
指標
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
99高中資訊科選修課程 夥伴學習教師 專業進修研習 進階程式設計--演算法 教學示例與研討
演算法時間複雜度 (The Complexity of Algorithms)
C程序设计.
算法导论第一次习题课.
C程序设计.
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
第二章 类型、对象、运算符和表达式.
累堆排序法 (Heap Sort).
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C程序设计.
第四章 函数 丘志杰 电子科技大学 计算机学院 软件学院.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
程式設計--linear search 通訊一甲 B 楊穎穆.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
第十二章 位运算.
C/C++基礎程式設計班 字元與字串 講師:林業峻 CSIE, NTU 3/14, 2015.
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
陳慶瀚 機器智慧與自動化技術(MIAT)實驗室 國立中央大學資工系 2013年5月28日
資料結構 老師:李崇明 助教:楊斯竣.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
資料!你家住哪裏? --談指標 綠園.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
Presentation transcript:

資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010

大綱 排序 搜尋 泡沫排序法(Bubble Sort) 選擇排序法(Selection Sort) 插入排序法(Insertion Sort) 搜尋 循序搜尋法(Linear Search) 二分搜尋法(Binary Search)

排序 (Sorting) 簡介 用途 將一群資料按照某一規則排列,使其具有遞增(減)的關係 資料搜尋 資料的分析與處理 5 1 4 2 3

泡沫排序法(Bubble Sort) 使用一迴圈連續對陣列把最大值放到最後 如果有n個數要做n-1次 5個數要做4次 i=5 34 12 5 66 1 i=4 12 5 34 1 66 i=3 5 12 1 34 66 i=2 5 1 12 34 66 i=1 1 5 12 34 66

泡沫排序法(Bubble Sort) 把最大值放到最後的方法 將相鄰的資料兩兩比較大小,決定是否交換。 如果有n個數要判斷n-1組數值 5個數要判斷4次 每次都可能交換 swap j=0 34 12 5 66 1 swap j=1 12 34 5 66 1 no swap j=2 12 5 34 66 1 swap j=3 12 5 34 66 1 j=4 12 5 34 1 66

泡沫排序法(Bubble Sort) 範例程式碼(將資料由小排到大) #include <stdio.h> void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } void print(int n, int *p) int i; for(i=0; i<n; i++) printf("%d ", p[i]); printf("\n"); int main() { int data[5] = {34,12,5,66,1}; // 欲排序的資料 int i, j; int n=5; for(i=n; i>1; i--) for(j=0; j<i-1; j++) if(data[j+1] < data[j]) swap(&data[j+1], &data[j]); } print(n, data); return 0;

選擇排序法(Selection Sort) 如果有n個數要做n-1次 5個數要做4次 i=0 34 12 5 66 1 i=1 1 12 5 66 34 i=2 1 5 12 66 34 i=3 1 5 12 66 34 i=4 1 5 12 34 66

選擇排序法(Selection Sort) 在一段資料中找出最大(小)值後,才做交換。 如果有n個數要判斷n-1個數值 5個數要判斷4次 只需交換一次 最小值位置 j=1 34 12 5 66 1 1 j=2 34 12 5 66 1 2 j=3 34 12 5 66 1 2 swap j=4 34 12 5 66 1 4 1 12 5 66 34 4

選擇排序法(Selection Sort) 範例程式碼(將資料由小排到大) #include <stdio.h> void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } void print(int n, int *p) int i; for(i=0; i<n; i++) printf("%d ", p[i]); printf("\n"); int main() { int data[5] = {34,12,5,66,1}; // 欲排序的資料 int i, j, pos; // pos: 紀錄目前最小值位置 int n=5; for(i=0; i<n-1; i++) pos = i; for(j=i+1; j<n; j++) // 找出最小值 if(data[j] < data[pos]) pos = j; } // 把最小值跟第 i 個做交換 swap(&data[i], &data[pos]); print(n, data); return 0;

插入排序法(Insertion Sort) 使用一迴圈連續對陣列的值做插入 如果有n個數要做n-1次 5個數要做4次 key i=1 34 12 5 66 1 key i=2 12 34 5 66 1 key i=3 5 12 34 66 1 key i=4 5 12 34 66 1 i=5 1 5 12 34 66

插入排序法(Insertion Sort) 對陣列的值做插入的方法 使用一迴圈將key插到適當的位置 將一段資料中最右(左)邊的資料當作key,然後往左(右)插入 此資料中作排序。 如果有n個數要判斷n-1個數值 資料比對次數較少 適合隨時有新資料需要被插入的應用 要被插入 的值(key) (2) j=0 34 12 5 66 1 12 (1)

插入排序法(Insertion Sort) 範例程式碼(將資料由小排到大) #include <stdio.h> void print(int n, int *p) { int i; for(i=0; i<n; i++) printf("%d ", p[i]); } printf("\n"); int main() { int data[5] = {34,12,5,66,1}; // 欲排序的資料 int i, j, key; // key: 紀錄要被插入的值 int n=5; for( i=1; i<n; i++) key=data[i]; for(j=i-1; j>=0 && data[j]>key; j--) data[j+1] = data[j]; } data[j+1] = key; //將key插入 print(n, data); return 0; ……

範例 寫一個讓使用者輸入之介面,功能如下 讓使用者任意輸入6個數字,將數字”由大到小” 做排序並將每次排序的結果輸出。 (1) 泡沫排序法 (2) 選擇排序法 (3) 插入排序法 讓使用者任意輸入6個數字,將數字”由大到小” 做排序並將每次排序的結果輸出。 (chap03_ex1.c)

範例 寫一個讓使用者輸入之介面,功能如下 (1) 泡沫排序法 (2) 選擇排序法 (3) 插入排序法 讓使用者任意輸入6個字串(字元陣列長度最大 128),將字串”由英文字母順序大到小”做排序 並將每次排序的結果輸出。 提示: 使用strcmp, strcpy來實作 strcmp(a,b) > 0 : a字串字母順序較大 strcmp(a,b) < 0 : b字串字母順序較大 strcmp(a,b) == 0 : a,b兩字串內容一樣 (chap03_ex2.c)

練習: 鏈結串列之插入排序法 寫一個使用者介面,功能如下: (請修改上一章範例chap02_ex.c) 輸入i,接著輸入一個整數放在一個節點中,再將此節點插入 於適當位置, 以保持資料由小到大。 輸入f,接著輸入一個整數,印出該整數是否存在鏈結串列中 輸入d,接著輸入一個整數,將鏈結串列中刪除一筆該整數資 料。 輸入l,印出鏈結串列中所有內容。 輸入q後程式結束。 (請修改上一章範例chap02_ex.c) head 插入資料 (key) 30 10 30 50 NULL

大綱 排序 搜尋 泡沫排序法(Bubble Sort) 選擇排序法(Selection Sort) 插入排序法(Insertion Sort) 搜尋 循序搜尋法(Linear Search) 二分搜尋法(Binary Search)

循序搜尋法(Linear Search) 簡介 範例程式碼 在一群資料中,從頭搜尋到尾直到找到資料為止。 int LinearSearch(int n, int *p, int value) { int i; for(i=0; i< n; i++) if(p[i] == value) return i; // 找到: 傳回資料位置 } return -1; // 找不到: 回傳-1

循序搜尋法(Linear Search) 使用迴圈一個一個找資料存放之位置 資料越多找越久… 要找的值 data 34 12 5 66 1 [0] [1] [2] [3] [4] value i data 34 12 5 66 1 [0] [1] [2] [3] [4] i data 34 12 5 66 1 [0] [1] [2] [3] [4] i data 34 12 5 66 1 [0] [1] [2] [3] [4] i data 34 12 5 66 1 [0] [1] [2] [3] [4]

二元搜尋法(Binary Search) 簡介 範例程式碼(在一群資料中找出變數key的索引值) 對一群排序過的資料,使用二分法的方式做搜尋。 範例程式碼(在一群資料中找出變數key的索引值) int BinarySearch(int n, int *p, int value) { int low=0, high=n, mid; while(low <= high) mid = (low + high) / 2; if(p[mid] > value) high = mid - 1; else if(p[mid] < value) low = mid+1; else return mid; } return -1;

二元搜尋法(Binary Search) 使用二分法找資料 必須確保資料有經過排序 要找的值 data 1 5 12 34 66 34 low mid high data 1 5 12 34 66 34 [0] [1] [2] [3] [4] value low mid high data 1 5 12 34 66 [0] [1] [2] [3] [4] low high mid data 1 5 12 34 66 [0] [1] [2] [3] [4]

範例 寫一個讓使用者輸入之介面,功能如下 關鍵: 插入時順便將資料排序 (1) 插入一整數於陣列 (2) 尋找一整數並印出 (使用線性搜尋法) (3) 尋找一整數並印出 (使用二元搜尋法) (4) 印出目前資料(由小到大) 關鍵: 插入時順便將資料排序 (chap03_ex3.c)

練習 寫一個讓使用者輸入之介面,功能如下 關鍵: 插入時順便將資料排序 (1) 插入一字串於陣列 (2) 尋找一字串並印出 (使用二元搜尋法) (3) 印出目前資料(由小到大) 關鍵: 插入時順便將資料排序