快速排序法 (Quick Sort).

Slides:



Advertisements
Similar presentations
第一节三 怎样实现合理膳食. 饮食与健康 探 究 竟探 究 竟 1. 根据课本后的部分食物营养成分表(附表一),分组将聪聪和明明一天所吃的 食物重量分别换算成糖类、蛋白质、脂肪和钙的重量。 聪聪(女 12 岁)明明(男 13 岁) 鸡 蛋 75g 油 条 200g 牛 奶 250g.
Advertisements

《地方名人文化资源网站的建设与应用研究》. 乐至名人 叶 镛 KJ09001 乐至县吴仲良中学 邓祖明.
While 迴圈 - 不知重複執行次數
1.1 程序和程序设计 程 序:简单的说程序就是指令的集合。 计算机设计语言: 机器语言 :二进制 0 、 1 汇编语言:助记符(英语单词)。 高级语言: 人类自然语言(数学语言 + 英语) 如: C 语言、 Qbasic 、 VB 等 第一章:程序设计基本概念.
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
软件工程 周志钊
“八皇后”问题 崔萌萌 吕金华.
第5章 排序与查找 PART A 《可视化计算》.
分治演算法 各個擊破獲得最後勝利 國立中央大學 資工系 江振瑞 教授.
第十章 内部排序 知识点3:快速排序.
第九章 排序 插入排序 交换排序 选择排序 归并排序 基数排序.
9.1 概述 9.2 插入排序 9.3 交换排序 9.4 选择排序 9.5 归并排序 9.6 基数排序 9.7 各种内部排序的比较
第五章 树 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
第十章 内部排序 10.1 概述 10.2 插入排序 直接插入排序 其他插入排序 希尔排序
課程名稱:資料結構 授課老師:_____________
分治演算法 各個擊破獲得最後勝利 國立中央大學 資工系 江振瑞 教授.
Linked List Operations
C语言程序设计 课程 第5章 数组 主讲:李祥 博士、副教授 单位:软件学院软件工程系.
高级语言程序设计 主讲人:陈玉华.
選擇排序法 通訊一甲 B 楊穎穆.
函數(一) 自訂函數、遞迴函數 綠園.
第十章 排序.
第九章 排序 概述 插入排序 交换排序 选择排序 归并排序 基数排序 外排序.
排序 Sorting.
第九章 排序 9.1排序的基本概念 9.2简单排序方法(复杂度 O(n2)) 9.3先进排序方法(复杂度 O(nLogn))
第9章 排序.
1、基本概念 2、插入排序 3、交换排序 4、选择排序 5、归并排序 6、基数排序 7、外部排序
If … else 選擇結構 P27.
搜尋資料結構 Search Structures.
程式撰寫流程.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第8章 排 序 8.1 排序技术概述 8.2 插入排序 8.3 选择排序 8.4 交换排序 8.5 归并排序 8.6 基数排序
中央广播电视大学开放教育试点课程 数据结构 辅导教师 倪政林.
数据结构 Data Structure CSU 主讲人:王国军,郑瑾 中南大学信息院计科系
第八章 使用指针.
計數式重複敘述 for 迴圈 P
第十章 指针.
数据结构 第一章 绪论.
如何赢一个机械键盘
第7章 程序验证 内容概述 程序逻辑:描述和论证程序行为的逻辑 从程序到定理 从定理到证明 循环不变式的推断
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
ACM 程序设计(一) 主讲:朱佳 博士 华南师范大学计算机学院.
資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.
程式結構&語法.
資料結構與演算法 第一章 基本概念 徐熊健 資料結構與演算法 徐熊健.
綠色能源.
第九章 排序 概述 插入排序 快速排序 交换排序(起泡排序) 选择排序 归并排序.
C 语言程序设计 程序的循环结构 电大崇信县工作站 梁海亮.
Instructor:Po-Yu Kuo 教師:郭柏佑
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
99高中資訊科選修課程 夥伴學習教師 專業進修研習 進階程式設計--演算法 教學示例與研討
第一章 C语言概述 教师:周芸.
第2章 认识C语言 教学要点 2. 1 项目二C语言程序识读 2 .2 项目三班级成绩排名 2 .3 知识链接 返回.
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
累堆排序法 (Heap Sort).
单片机原理及应用 实践部分 主讲人:刘 强 四川工商学院单片机教学团队 单片机原理及应用 实践部分 主讲人:刘 强
隨機數 (亂數) 10後,取餘數 n = rand(); 利用 Code::Block 驗證一下 n = rand() %10; 998
元 排 序 法.
程式設計--linear search 通訊一甲 B 楊穎穆.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
資料結構 老師:李崇明 助教:楊斯竣.
Advanced Competitive Programming
算法的基本思想: 第6章 内部排序 6.2 气泡排序 将待排序的记录看作是竖着排列的“气泡”,关键字较小 的记录比较轻,从而要往上浮。
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
排序 排序(sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。 由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机存储器中进行的排序过程;另一类是外部排序,指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中对外存进行访问的排序过程。
函式庫補充資料 1.
C语言基础学习 从外行到入门.
隨機函數.
Presentation transcript:

快速排序法 (Quick Sort)

定義 由C. A. R. Hoare 所創的快速排序法。 其主要的原理是利用遞迴概念,將陣列分成二部份: 第一部分中的所有元素的值都小於某一個預先選定的基準值(pivot), 第二部分中的所有元素的值都大於基準值; 這二部分的資料再根據同樣的方式,再分別作快速排序。

基本運算 假設要排序的元素如下: K(1),K(2),……,K(n) 則快速排序法的一個步驟是將串列分割成兩個子串列

其演算的步驟: 若n=1,則return; 令分隔點K(p)為第一筆資料的值 由左向右找出一筆資料K(i),使得K(i)>K(p); 由右向左找出一筆資料K(j),使得K(j)<K(p); 若i<j則K(i)與K(j)交換,並回到步驟2; 若i≧j,則將K(j)與K(p)交換,並以j為基點將資料分割成左右兩半,然後分別針對左右兩半進行步驟1~5。

演算法 =>C語言程式碼 quick_sort(int a[ ], int l, int r) { int p, i, j, t ; if ( l < r) i = l +1 j = r ; p = a [ l ];

do { while (a [ i ] < p) i + +; while (a [ j ] > p) j - - ; if ( i < j ) { t = a [ i ]; a [ i ] = a [ j ] ; a [ j ] = t; }

while ( i < j ); a [ l ] = a [ j ]; a [ j ] = p ; qsort ( a, l, j – 1) ; qsort ( a, j + 1, r ) ; }

=>時間複雜度分析 最差情況: 若所選的pivot每次皆最小值,則執行時間

平均分析 假設所選的pivot將串列分成兩個子串列,其平均執行時間分別 為T(j),和T(n-j-1),j之值可能由1到n且機率皆相等,因此 T(n) = O(nlogn)

程式實例 #include <studio.h> void quick_sort ( int [ ], int ) ; void main ( ) { int data [20] ; int size = 0, i; printf ( “\nPlease enter number to sort (enter 0 when end):\n ) ; printf ( “Number : “ ) do { scanf ( “%d “, &data [size] ); } while (data [size ++] != 0 ) ; for ( i = 0; i < 60 ; i ++ ) printf ( “-” ) ; printf ( “\nSorting : “ ); for ( I = 0; I < size ; i ++) printf ( “%d “, data [i] ); }

void quick_sort (int data[ ], int left, int right, int size ) { int lbase, rbase, compare, temp, i; for (base = 1; base < size ; base ++) temp = data [base] ; compare = base ; while ( compare > 0 && data [compare – 1] > temp) data [compare] = data [compare – 1]; compare - -; } data [compare] = temp ; printf ( “Access : “) ; for ( I = 0; i < size ; i ++) printf ( “%d “, data [i]) ; printf ( “\n” ) ;

合併排序法 (Merge Sort)

定義 合併排序是一種非常重要的排序方法,由John von Neumann所提出,其原理是先把陣列分解成兩個陣列,大小相等或僅差一個元素 例如10個元素的陣列可分成兩個各含5個元素的陣列,11個元素的陣列則可分成一個含5個元素,而另一個含6個元素的陣列,一直分到不能再分為止,然後再進行排序並且合併的操作。

合併排序

合併排序最重要的一個用途是外部排序,當資料量大到無法全部讀入主記憶體裡進行排序時,可以先讀入部份資料,將這些資料排序完畢之後,再存回到輔助記憶體,它便成了有序資料,接下來分階段讀入部分有序資料進行合併排序,然後將結果存入外部記憶體,直到所有的資料排序完成為止。

基本運算 陣列的分解與合併排序的例子如圖所示。 在程式的設計上可考慮採用遞迴(Recursion)的方式,陣列分解完之後進行的合併排序,也就是Merge程序。 當兩個陣列已經分別排序完成,我們從兩個陣列的最小元素開始比大小,一一地拷貝到一個新的陣列中。

演算法 =>C語言程式碼 merge_sort(int a[ ], int b[ ], int s, int m, int t) { int i, j, k ; i = k = s ; j = m + 1 ; while ( i <= m && j <= t) if ( a [i ] <= a [ j ] ) b [ k + + ] = a [ i + + ] ; else b [ k + + ] = a [ j + + ] ;

while ( i <= m) b [ k + + ] = a [ i + + ] ; while ( j<= t) b [ k + + ] = a [ j + + ] for ( i = s ; i <= t ; i + + ) a [ i ] = b [i ] ; }

=>時間複雜度分析 合併的分類是穩定的情況 其最壞與平均的時間複雜度均為O (nlogn) 所需的額外空間和檔案大小成正比。

程式範例-合併排序 #include <studio.h> void select_sort ( int [ ], int ) ; void merge_sort ( int [ ], int [ ], int[ ], int, int ) ; void main ( ) { int data 1[10], data2[10], data3[20] ; int size1 = 0, size2 = 0, i; printf ( “\nPlease enter data1 to sort (enter 0 when end):\n ) ; printf ( “Number : “ )

do { scanf ( “%d “, &data1 [size1] ); } while (data1[size1 ++] != 0 ) ; printf ( “\nPlease enter data2 to sort (enter 0 when end):\n ) ; printf ( “Number : “ ) scanf ( “%d “, &data2 [size2] ); } while (data2[size2 ++] != 0 ) ; select_sort ( data1, --size1 ) ; select_sort ( data2, --size2 ) ;

for ( i = 0; i < 60 ; i ++ ) printf ( “-” ) ; printf ( “\nData 1 : “ ) ; for ( i = 0; i < size1 ; i ++) printf ( “%d “, data1 [i] ) ; printf ( “\n” ) ; printf ( “Data2 : “) ; for ( i = 0; i < size2 ; i ++) printf ( “%d “, data2 [i] ) ; }

merge_sort ( data1, data2, data3, size1, size2 ) ; for ( i = 0; i < 60 ; i ++ ) printf ( “-” ) ; printf ( “\nSorting : ” ) ; for ( i = 0 ; i < size1 +size2; i ++) printf ( “%d “, data3[i] ) ; } void select_sort ( int data [ ], int size ) { int base, compare, min, temp ;

for ( base = 0; base < size – 1; base ++ ) { min = base ; for ( compare = base +1; compare < size; compare ++) if ( data [compare ] < data [ min ] ) min = compare; temp = data [min ] ; data[ min ] = data [ base ] ; data[ base ] = temp ; }

void merge_sort ( int data1 [ ], int data2 [ ], int data3 [ ], int size1, int size2 ) { int arg1, arg2, arg3, I ; data1 [size1] = 32767 ; data2 [size2] = 32767 ; arg1 = 0 ; arg2 = 0 ; for ( arg3 = 0; arg3 < size1 +size2; arg3 ++)

if ( data1 [arg1] < data2 [arg2 ]) { data3 [arg3] = data1 [arg1] ; arg1 ++ ; } else data3 [arg3] = data2 [arg2] ; arg2 ++ ;

printf ( “ Access : “ ) ; for ( i = 0 ; i < arg3 +1; i ++ ) printf ( “%d “, data3 [i] ) ; printf ( “\n” ); }