第十章 内部排序 知识点3:快速排序.

Slides:



Advertisements
Similar presentations
早自修課推動班級家長說故事及 經驗分享活動。 寒假親師生戶外參訪 ~ 原鄉文化、田園野趣學 習之旅 ~ 造訪鍾理和紀 念館、文學步道。親師生戶外參訪.
Advertisements

《礼记 · 学记》学习心得报告 教育的本质与运用 主讲人:徐浩明. 一、认识什么是教育 二、明白教育的本质 三、如何落实德行教育.
While 迴圈 - 不知重複執行次數
台北市立聯合醫院南軟門診部 皮膚科醫師簡介 溫素瑩醫師 學經歷: 中山醫學院醫學系畢業 台北醫學大學醫學資訊研究所碩士
兵 车 行 杜甫.
第2课 大一统与秦朝中央集权制度的确立 课标要求: 知道“始皇帝”的来历和郡县制建立的史实,了解中国古代中央集权制度的形成及其影响。
第十四篇 答李翊書 韓 愈.
南通市卫生监督所副主任医师 南京医科大学副教授 施 飞
史記 貨 殖 列 傳                                                            商业篇.
主讲:计算机工程学院 李兰 答疑地点:主教学楼B区213
防制學生藥物濫用 高雄市教育局校外分會 林永興教官.
高考复习专题 文言文翻译
评价是为了促进 学生发展的评价。. 评价是为了促进 学生发展的评价。 语言有温度,字词知冷暖.
排序.
第6章 程序设计与算法 计算机应用基础 数学与计算机工程学院.
第九章 排序 插入排序 交换排序 选择排序 归并排序 基数排序.
9.1 概述 9.2 插入排序 9.3 交换排序 9.4 选择排序 9.5 归并排序 9.6 基数排序 9.7 各种内部排序的比较
第5章 回溯法 “通用的解题法” 欢迎辞.
第十章 内部排序 10.1 概述 10.2 插入排序 直接插入排序 其他插入排序 希尔排序
食物在口腔里的变化.
酒 中国是一个 文化历史悠久的国家.
2009年 初夏 某天 我 一個人 一輛車 計劃 沒有計劃 只想 漫無目的 到處亂晃 感覺夏天的散漫.
对程序进行推理的逻辑 计算机科学导论第二讲
理解常见文言实词在文中的含义.
班級:夜師資一甲 指導老師:蘇國榮老師 姓名:929201林佑蓉 石依縈 李玉玫 桂秀媛
杨玉环(公元719-756年) 杨玉环,名玉环,字太真,唐玄宗李隆基的宠妃,原名杨芙蓉(故有芙蓉出水),出生地为四川成都,祖籍山西永济。杨贵妃自小习音律,善歌舞,姿色超群。曾祖父杨汪是隋朝的上柱国、吏部尚书,唐初被李世民所杀,父杨玄琰(yǎn),是蜀州(四川崇州)司户,其叔父杨玄璬(jiǎo)曾任河南府士曹,杨玉环的童年是在四川度过的,10岁左右,父亲去世,她寄养在洛阳的三叔杨玄璬家。后来又迁往山西永乐(山西永济)。 
左迁至蓝关示侄孙湘 韩愈.
科普说明文 生物入侵者 高天群.
文化底蕴与作文 第一节:底蕴成句 【温馨点拨】:底蕴成句是把含有文化底蕴的内容表达成句。底蕴成句有三种情况:
第8章 排序.
第十章 排序.
第九章 排序 9.1排序的基本概念 9.2简单排序方法(复杂度 O(n2)) 9.3先进排序方法(复杂度 O(nLogn))
快速排序法 (Quick Sort).
第9章 排序.
1、基本概念 2、插入排序 3、交换排序 4、选择排序 5、归并排序 6、基数排序 7、外部排序
If … else 選擇結構 P27.
搜尋資料結構 Search Structures.
第九章 排序 9.1排序的基本概念 9.2简单排序方法(复杂度 O(n2)) 9.3先进排序方法(复杂度 O(nLogn))
第4章 数组和集合 4.1 一维数组 4.2 二维数组 4.3 Array类 4.4 交错数组 4.5 ArrayList类
1.1 数据结构讨论的范畴 1.2 基本概念 1.3 算法和算法的量度.
本章重点难点 重点:顺序查找、二分查找、二叉排序树查找以及散列表查找的基本思想和算法实现。
第 3 讲 线性表(一).
第9章 内部排序 9.1 概述 9.2 插入排序 9.3 快速排序 9.4 选择排序 9.5 归并排序 9.6 基数排序
数据结构 Data Structure CSU 主讲人:王国军,郑瑾 中南大学信息院计科系
第九章 查找 2019/2/16.
計數式重複敘述 for 迴圈 P
数据结构 第一章 绪论.
王玲 第 2 章 线性表 王玲 2019/2/25.
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
ACM 程序设计(一) 主讲:朱佳 博士 华南师范大学计算机学院.
Week 2: 程式設計概念與 演算法的效能評估
第1章 绪论 2019/4/16.
山东师范大学信息科学与工程学院软件工程研究所 徐连诚 2006年11月20日
第5章 回溯法 欢迎辞.
飯店業的介紹.
第九章 排序 概述 插入排序 快速排序 交换排序(起泡排序) 选择排序 归并排序.
第1章 绪论(二) 教学目标 理解算法的特性及评价标准 掌握算法时间复杂度和空间复杂度的分析方法 1/
Ch.9 查找 §9.1 基本概念 查找和排序是两个重要的运算
算法导论第一次习题课.
累堆排序法 (Heap Sort).
進階資料結構(2) Disjoint Sets
复杂度和测试数据 吴章昊.
2009年 初夏 某天 我 一個人 一輛車 計劃 沒有計劃 只想 漫無目的 到處亂晃 感覺夏天的散漫 按鍵換頁--輕音樂欣賞.
信用部財務專業人員初級研習班 台灣債券市場簡介
第8章 排序 8.1排序基本概念 8.2插入类排序 8.3交换类排序 8.4选择类排序 8.5归并排序 8.6基数排序
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
判斷(選擇性敘述) if if else else if 條件運算子.
算法的基本思想: 第6章 内部排序 6.2 气泡排序 将待排序的记录看作是竖着排列的“气泡”,关键字较小 的记录比较轻,从而要往上浮。
排序 排序(sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。 由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机存储器中进行的排序过程;另一类是外部排序,指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中对外存进行访问的排序过程。
第二章 Java基本语法 讲师:复凡.
Presentation transcript:

第十章 内部排序 知识点3:快速排序

对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置。 一、起泡排序 排序过程: 首先,将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止——第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上。 对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置。 重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止。

38 例 49 38 65 97 76 13 27 30 初始关键字 38 49 65 76 13 27 30 97 第一趟 38 49 65 13 27 30 76 第二趟 38 49 13 27 30 65 第三趟 13 38 13 27 30 49 第四趟 13 27 30 38 第五趟 13 27 30 第六趟 49 13 38 27 38 13 49 30 27 76 38 13 65 27 30 49 97 13 49 76 27 30 65 97 76 30 65 27 30 97 76 97

算法描述: void BubbleSort(SqList &L){ // 对顺序表L作起泡排序 for (i=L.length, change=TRUE; i>1 && change; --i) {  change = FALSE;  for (j=1; j<i; ++j)   if (L.r[j].key > L.r[j+1].key){ L.r[j]←→L.r[j+1]; change = TRUE; } }// for I } // BubbleSort

算法评价 时间复杂度 最好情况(正序) 比较次数:n-1 移动次数:0 最坏情况(逆序) 比较次数: 移动次数: T(n)=O(n²) 空间复杂度:S(n)=O(1)

二、快速排序——对起泡排序的改进 基本思想: 通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序 枢轴 :中间分界的关键字称枢轴 排序过程:对r[s……t]中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=r[s],x=rp.key

初始时令i=s,j=t 首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp交换 再从i所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换 重复上述两步,直至i==j为止 再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止

x 例 初始关键字: 49 38 65 97 76 13 27 50 27 13 49 49 49 97 65 49 i j j i i j i j i j j i i j i j 完成一趟排序: ( 27 38 13) 49 (76 97 65 50) 分别进行快速排序: ( 13) 27 (38) 49 (50 65) 76 (97) 快速排序结束: 13 27 38 49 50 65 76 97

int Partition (Elem R[], int low, int high) { // 交换记录子序列R[low..high]中的记录,使枢轴记录到位,并返 //回其所在位置,此时在它之前(后)的记录均不大(小)于它 pivotkey = R[low].key; // 用子表的第一个记录作枢轴记录 while (low<high) { // 从表的两端交替地向中间扫描 while (low<high && R[high].key>=pivotkey) --high; R[low]←→R[high]; // 将比枢轴记录小的记录交换到低端 while (low<high && R[low].key<=pivotkey) ++low; R[low]←→R[high]; // 将比枢轴记录大的记录交换到高端 } return low; // 返回枢轴所在位置 } // Partition  

Pivotkey=49 例 初始关键字: 49 38 65 97 76 13 27 50 13 49 97 27 65 j i i j i j i j i j j i i j i j 完成一趟排序: ( 27 38 13) 49 (76 97 65 50) 分别进行快速排序: ( 13) 27 (38) 49 (50 65) 76 (97) 快速排序结束: 13 27 38 49 50 65 76 97

int Partition (Elem R[], int low, int high) { // 交换记录子序列R[low..high]中的记录,使枢轴记录到位,并返回 //其所在位置,此时 在它之前(后)的记录均不大(小)于它 R[0] = R[low]; // 用子表的第一个记录作枢轴记录 pivotkey = R[low].key; // 枢轴记录关键字 while (low<high) { // 从表的两端交替地向中间扫描 while(low<high&& R[high].key>=pivotkey) --high;

R[low] = R[high]; // 将比枢轴记录小的记录移到低端 while (low<high && R[low].key<=pivotkey) ++low; R[high] = R[low]; // 将比枢轴记录大的记录移到高端 } R[low] = R[0]; // 枢轴记录到位 return low; // 返回枢轴位置 } // Partition

R[low] = R[high]; // 将比枢轴记录小的记录移到低端 while (low<high && R[low].key<=pivotkey) ++low; R[high] = R[low]; // 将比枢轴记录大的记录移到高端 } R[low] = R[0]; // 枢轴记录到位 return low; // 返回枢轴位置 } // Partition 容易看出,调整过程中的枢轴位置并不重要,因此,为了减少记录的移动次 数,应先将枢轴记录“移出”,待求得枢轴记录应在的位置之后(此时low=high),再将枢轴记录到位。

快速排序的递归过程可用生成一棵二叉树形象地给出, 快速排序算法描述:P275 276 27 65 8 38 96 55 49 14 74 快速排序的递归过程可用生成一棵二叉树形象地给出, 效率分析 空间效率:每层递归调用时的指针和参数均要用栈来存放 理想情况:O(nlogn),即树的高度; 最坏情况:二叉树是一个单链,为O(n2)。 待排序列对应递归调用过程的二叉树

时间效率:在n个记录的待排序列中,一次划分为O(n),若设T(n)为对n个记录的待排序列进行快速排序所需时间。 理想情况: (每次总是选到中间值作枢轴) 每次划分,正好将分成两个等长的子序列,则 T(n))=O(nlog2n)  最坏情况: (每次总是选到最小或最大元素作枢轴)时效为O(n2)。 返回

快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。为改进之,通常以“三者取中法”来选取支点记录,即将排序区间的两个端点与中点三个记录关键码居中的调整为支点记录。

知识点小结 本知识点主要学习内部排序中交换排序的基本原则,详细讲解了快速排序的过程、两个实现的算法及其效率分析。