1、基本概念 2、插入排序 3、交换排序 4、选择排序 5、归并排序 6、基数排序 7、外部排序

Slides:



Advertisements
Similar presentations
提升教學品質研討會 工學院教師教學經驗分享 長庚大學 資訊工程學系 / 醫療機電工程研究所 助理教授 趙一平 2015/04/10.
Advertisements

五專醫護類科介紹 樹人醫專 職業教育組 李天豪 組長.
7.4 用矩阵初等行变换 解线性方程组 主要内容: 一.矩阵的行初等变换 二.用行初等变换求逆矩阵 三.用矩阵法求线性方程组.
小班早期阅读讲座.
股票市場技術面概念介紹 斗六高中 馬明宏.
第二次直播 清华大学 殷人昆 中央电大 徐孝凯.
四資二甲 第三週作業 物件導向程式設計.
程序设计实习 3月份练习解答
Memory Pool ACM Yanqing Peng.
我班最喜愛的零食 黃行杰.
全力以赴的德忠精神 人力资源部王丽玲主任,从员工关系的工作,到招聘工作,再到现在的薪酬工作,不管在哪个岗位,她总是一丝不苟,尽职尽责。
第十章 内部排序 知识点3:快速排序.
第九章 排序 插入排序 交换排序 选择排序 归并排序 基数排序.
第八章 查找.
第十章 内部排序 10.1 概述 10.2 插入排序 直接插入排序 其他插入排序 希尔排序
第二章 线性表 1 线性表的逻辑结构及其基本操作 2 线性表的顺序存储结构 3 线性表的链式存储结构 4 静态链表 5 应用实例.
第8章 查找 数据结构(C++描述).
第8章 字串與陣列 8-1 字串處理 8-2 一維陣列的處理 8-3 建立多維陣列 8-4 不規則陣列與參數傳遞 8-5 陣列排序與搜尋.
马克思主义基本原理概论 第三章 人类社会及其发展规律.
簡 報 內 容 一、科技部統計學門簡介 二、申請與撰寫科技部計畫 三、計畫審核 四、建議.
Chapter 7 Search.
Tree(樹) 什麼是「樹」? 「樹」的範例 「樹」的定義 「樹」的表示法.
Linked List Operations
微處理機原理與應用 Chapter 1 簡介 Chung-Min Wu, Ph.D
第11章 查找 主要知识点 查找的基本概念 静态查找表 动态查找表 哈希表.
第8章 排序.
第十章 排序.
第九章 排序 概述 插入排序 交换排序 选择排序 归并排序 基数排序 外排序.
Chap 3 堆疊與佇列 Stack and Queue.
排序 Sorting.
第九章 排序 9.1排序的基本概念 9.2简单排序方法(复杂度 O(n2)) 9.3先进排序方法(复杂度 O(nLogn))
快速排序法 (Quick Sort).
第9章 排序.
第七章 搜索结构 静态搜索结构 二叉搜索树 AVL树.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
第12章 樹狀搜尋結構 (Search Trees)
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
專業染髮操作流程步驟 染前判斷/色系ˋ色調 東方人的髮色之所以偏黑,是因為頭髮的皮質層中含有蛋白質構成的色素粒子,也就是頭髮的麥拉寧色素
第一章 绪论.
五、链 表 1、单链表 2、双向链表 3、链表应用.
第9章 内部排序 9.1 概述 9.2 插入排序 9.3 快速排序 9.4 选择排序 9.5 归并排序 9.6 基数排序
数据结构 Data Structure CSU 主讲人:王国军,郑瑾 中南大学信息院计科系
二叉树和其他树 (Binary and other trees)
第九章 查找 2019/2/16.
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
Tree & Binary Tree.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
ACM 程序设计(一) 主讲:朱佳 博士 华南师范大学计算机学院.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.
top b top a a top 空栈 a 进栈 b 进栈 top top e e e top d d d c c c b b b a a
第九章 排序 概述 插入排序 快速排序 交换排序(起泡排序) 选择排序 归并排序.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
99高中資訊科選修課程 夥伴學習教師 專業進修研習 進階程式設計--演算法 教學示例與研討
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
累堆排序法 (Heap Sort).
第一章复习 1、聚合物的分类和命名 常见聚合物的习惯命名 2、聚合反应 重点掌握按聚合机理的分类: 连锁聚合 逐步聚合 3、聚合物的分子量和分子量分布 4、聚合物微结构(链结构)的概念.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第8章 排序 8.1排序基本概念 8.2插入类排序 8.3交换类排序 8.4选择类排序 8.5归并排序 8.6基数排序
C++程序语言设计 Chapter 14: Templates.
排序 排序(sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。 由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机存储器中进行的排序过程;另一类是外部排序,指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中对外存进行访问的排序过程。
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
Q1 以下是10個初生嬰兒,首6個月的體重改變紀錄
第二章 Java基本语法 讲师:复凡.
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
Presentation transcript:

1、基本概念 2、插入排序 3、交换排序 4、选择排序 5、归并排序 6、基数排序 7、外部排序 十七、排序 1、基本概念 2、插入排序 3、交换排序 4、选择排序 5、归并排序 6、基数排序 7、外部排序

1、基本概念 ⑴排序的定义 设有n个对象的序列为 {R0,R1,· · ·,Rn-1} 其对应的关键字序列为 {K0,K1,· · ·,Kn-1} 对(0,1, · · ·,n-1)确定一种排列(p0,p1, · · ·,pn-1), 使相应的关键字满足非递减(或非递增)关系: Kp0≤Kp1≤· · ·≤Kpn-1 即使n个对象的序列成为 {Rp0,Rp1,· · ·,Rpn-1} 这样一种操作称为排序。 其中:关键字Ki,(i = 0, 1,· · ·, n-1)可以是主关键字,也可以是次 关键字,甚至是若干个属性的组合。

基本概念(续) ⑵稳定的排序 设待排序的序列中有两个或两个以上相等的关键字Ki=Kj, (0≤i,j≤n-1,i≠j),且在排序前的序列中Ri处于Rj之前(即 i<j)。若排序后Ri仍处于Rj之前,称此种排序方法是稳定的。 否则称这个排序方法是不稳定的。 ⑶内排序与外排序 根据在排序过程中数据对象是否完全在内存,予以区分。 内排序是指在排序期间数据对象全部存放在内存的排序; 外排序是指在排序期间因数据对象个数太多,按照排序过程 的要求,分若干批放在内存中进行的排序。 ⑷排序的时间开销 按照排序的特点,排序的时间开销用算法执行中关键字比较 次数和数据移动次数来衡量。一般情况下用平均时间估算, 特殊情况也有按最好情况或最坏情况进行估算的。

2、插入排序 ⑴直接插入排序 基本思想:从序列前端开始,把序列分成两部分,前面部分是 已排好序的,即当要处理Ri时, Rp0,Rp1,· · ·,Rpi-1已排好 序。只要用Ri的关键字与 Rpi-1 、Rpi-2、· · ·的关键字顺序比较, 找到插入位置后,将Ri插入,相关的对象向后顺移。反复这个 过程直到序列中所有对象都处理完毕。 void InsertionSort(SeqList<Datatype> & SortableList ) { int firstunsorted, position; Datatype temp; for (firstunsorted = 1; firstunsorted<n; firstunsorted + +) if SortableList[firstunsorted]<SortableList[firstunsorted-1] position = firstunsorted; temp = SortableList[firstunsorted]; do { SortableList[position] = SortableList[position-1]; position - -; } while ( postion>0 && SortableList[position-1]> temp; SortableList[position] = temp; }

直接插入排序的例 示意图 firstunsorted temp 小于等于temp 大于temp unsorted 小于等于temp

直接插入排序性能分析 最好情况: 排序前序列已按关键字大小从小到大排列,每一趟只需与比较1 次关键字,移动2次数据对象。总计关键字比较为n-1次,数据 移动2(n-1)次。 最坏情况: 序列处于反序状态。即每一趟必须与前面所有的关键字作比较, 并每做1次比较,就要移动1次数据。总计有n-1趟,因此 总比较次数为 总移动次数为 平均时间复杂度为O(n2) 稳定性:从算法看,显然是稳定的。

由于前端是有序序列,可以考虑用折半搜索法确定插入位置。 但由于移动次数无法再减少,因此,时间复杂度没有本质改 善。 ②链表结构的直接插入排序 其它直接插入排序 ①利用折半搜索确定插入位置 由于前端是有序序列,可以考虑用折半搜索法确定插入位置。 但由于移动次数无法再减少,因此,时间复杂度没有本质改 善。 ②链表结构的直接插入排序 head current R0 R1 Ri Rn-1 ∧ ∧ R0 R1 Ri Rn-1 ∧ Rp0 Rpi-1 ∧ Ri Rn-1 ∧

高级插入排序 ⑵Shell排序 产生Shell排序背景 当n不大,并且原序列基本有序的情况下,直接插入有其优势。 基本思想:先将待排序的序列分解成几个子序列,对子序列 进行直接插入排序,然后缩小间距再分解成几个子序列,继 续对它们进行直接插入排序,如此进行若干趟,等到整个序 列基本有序后,再对整个序列施行直接插入排序。 分解子序列的间隔(增量),是一个递减的,又称为减小增量排 序。 增量的序列有:d[k] = 2t-k+1 - 1,其中t为排序总趟数,k为某具体趟次。最后一趟,增量肯定是1,表示对整个序列排序。 还有其它的取法:d = currentlengh d/2 + 1 d/3 + 1 等等

Shell排序的例 49 38 65 97 76 13 27 84 55 04 49 34 13 49 87 89 49 84 87 38 55 89 04 65 49 97 34 76 13 13 27 49 49 38 04 49 34 13 27 84 55 65 97 76 13 49 87 89 13 27 49 49 65 89 34 38 49 84 97 04 13 55 76 87 13 34 04 27 38 13 49 49 55 49 84 76 65 97 87 89 04 13 13 27 34 38 49 49 49 55 65 76 84 87 89 97

Shell排序算法 void ShellSort(SeqList<Datatype> & list) { int increment = size/3; while (increment>=1){ ShellInsert( list, increment); increment = increment/3; } Void ShellInsert(Seqlist<Datatype> & list, int increment) for(i = increment; i<size; i + +) { Datatype temp = list[i]; int j = i; while (j>=increment && temp<list[j-increment]){ list[j] = list[ j – increment]; j - =increment; list[j] = temp;

起泡排序效率低的原因是数据对象移动太慢。 一个对象在序列中正确的位置应具有哪些特征? 3、交换排序 ⑴起泡排序 ⑵快速排序(quick sort) 起泡排序效率低的原因是数据对象移动太慢。 一个对象在序列中正确的位置应具有哪些特征? 各关键字不大于Ri的关键字 Ri 各关键字大于Ri的关键字

快速排序的例 49 38 65 97 76 13 27 49 i j j 27 38 65 97 76 13 49 49 i i j 27 38 49 97 76 13 65 49 i j j 27 38 13 97 76 49 65 49 i i j 27 38 13 49 76 97 65 49 ij j 27 38 13 49 76 97 65 49 完成一趟排序 分别对{27,38,13}和{76,97,65,49}排序。

快速排序算法 void QuickSort(SeqList<T> &list, const int left, const int right) { if (left<right) { int position = Partition(list, left, right); QuickSort(list, left, position-1); QuickSort(list, position+1, right); } void Partition(SeqList<T> &list, const int low, const int high) int i = low; int j = high; Datatype temp = list[low]; while (i<j) { while ((i<j)&&(list[j]>=temp)) {j - -}; list[i] = list[ j]; list[j] = temp; while ((i<j)&&(list[i]<=temp)) {i + +}; list[j] = list[i]; list[i] = temp; return position;

i+1个数据对象时,前面i个对象Rp0,Rp1,· · ·,Rpi-1已排好序。 4、选择排序 ⑴直接选择排序 基本思想:从序列前端开始,把序列分成两部分,即当要处理第 i+1个数据对象时,前面i个对象Rp0,Rp1,· · ·,Rpi-1已排好序。 只要在 Ri 、Ri+1、· · ·、 Rn-1中选择关键字最小的,作为Rpi。反 复这个过程直到序列中所有对象都处理完毕。 直接选择排序的示意图 Rp0,Rp1,· · ·,Rpi-1 Ri Ri+1、· · ·、 Rn-1 Rp0,Rp1,· · ·,Rpi-1 Ri Ri+1、· · ·、 Rk 、· · ·、 Rn-1 Rp0,Rp1,· · ·,Rpi-1、Rk Ri+1、· · ·、 Ri 、· · ·、 Rn-1

直接选择排序算法与分析 直接选择排序算法 void SelectSort(SeqList<T> &list ) { for (int i = 0; i<size-1; i ++) SelectElement( list, i ); } void SelectElement(SeqList<T> &list, const int i ) int k = i; // 当前最小关键字所在位置 for (int j = i+1; j<size; j + +) if ( list[j]<list[k]) k = j; if ( k!= i) { temp = list[k]; list[k] = list[i]; list[i] = temp; 选择趟数为n-1,比较次数为n-i - 1,移动次数最好情况 为0次,最坏情况为3(n-1)。

锦标赛排序的基本思想:首先对n个关键字两两比较,得到 个比较的优胜者,作为第一批比较的结果保留下来,然 直接选择排序的缺点是经常重复比较。 锦标赛排序的基本思想:首先对n个关键字两两比较,得到 个比较的优胜者,作为第一批比较的结果保留下来,然 后对这 对象再作两两比较,如此反复,直到选出一个关 键字最小为止。 08 21 08 21 25 08 63 21 25 49 25 16 08 63

锦标赛排序的算法 结点的结构 template <class T> class DataNode { public:: Datatype data; // 数据项 int index; // 结点号,完全二叉树存储下标 int active; // 参选标志 } 算法中的要点 计算数组大小:外结点数是大于等于n的2的最小幂次数 树的结点数等于2倍外结点减1 左右兄弟的确定 算法的时间复杂度 辅助空间太多

堆排序 堆排序的基本思想 “堆化”数组,使用filterdown形成初始堆; 通过交换和调整(filterdown)堆进行排序。 堆排序的性能 堆排序的时间复杂度 堆排序的空间复杂度为常数

基数排序 建立在多关键字的基础上,通过“分配”与“收集”进行排序。 基本思想: 设有关键字:K1、K2、· · ·、Kd,首先按最低位关键字Kd对所有 对象进行一趟排序,然后按次低位关键字Kd-1在上一趟排序结果 再排序,依次类推,直到按最高位K1排序结束。 对单关键字情况,也可以将单关键字分解成若干位的子关键字 组,然后对这个子关键字组按多关键字处理。如关键字是6位整 数,位数是6,基数是10;如果4位英文字母组成的关键字,则 位数是4,基数是26(假设不分大小写)。 按照基数设定所需队列的个数;设置两各指针数组,分别存放 队列的头和尾, “分配”与“收集”工作就借助这两个数组中的指 针完成。

基数排序示意图 基数排序 rear front 1 2 3 4 d-1 d 1 2 3 4 d -1 d