中央广播电视大学开放教育试点课程 数据结构 辅导教师 倪政林.

Slides:



Advertisements
Similar presentations
《礼记 · 学记》学习心得报告 教育的本质与运用 主讲人:徐浩明. 一、认识什么是教育 二、明白教育的本质 三、如何落实德行教育.
Advertisements

不知者無罪嗎 ? 【本報台北訊】國內知名大學胡姓研究 生進口豬籠草在網路上販售,涉嫌違反 植物防疫檢疫法,胡姓研究生表示不知 道豬籠草是違禁品並當場認錯道歉 台北地檢署檢察官念他初犯,昨 天處分緩起訴,但命他繳交六萬 元緩起訴處分金作公益。 豬籠草有潛移性線蟲寄生,一旦植物感 染後,輕則枯萎凋零,重則危害農業經.
摸清变化 调整现状 信息技术学考选考阅卷体会和启示 嵊州高级中学 马喜音.
報告書名:父母會傷人 班級:二技幼四甲 姓名:吳婉如 學號:1A2I0034 指導老師:高家斌
兵 车 行 杜甫.
《C语言程序设计》复习
媽,我們真的不一樣 青少年期與中年期 老師: 趙品淳老師 組員: 胡珮玟4A1I0006 馬菀謙4A1I0040
第2课 大一统与秦朝中央集权制度的确立 课标要求: 知道“始皇帝”的来历和郡县制建立的史实,了解中国古代中央集权制度的形成及其影响。
第十四篇 答李翊書 韓 愈.
史記 貨 殖 列 傳                                                            商业篇.
高考复习专题 文言文翻译
班級:二幼三甲 姓名:郭小瑄 、 詹淑評 學號:1A2I0029 、1A2I0025
第九章 排序 插入排序 交换排序 选择排序 归并排序 基数排序.
9.1 概述 9.2 插入排序 9.3 交换排序 9.4 选择排序 9.5 归并排序 9.6 基数排序 9.7 各种内部排序的比较
資料結構與演算法 課程教學投影片.
第十章 内部排序 10.1 概述 10.2 插入排序 直接插入排序 其他插入排序 希尔排序
食物在口腔里的变化.
酒 中国是一个 文化历史悠久的国家.
对程序进行推理的逻辑 计算机科学导论第二讲
理解常见文言实词在文中的含义.
C语言基础——指针的高级应用 Week 05.
杨玉环(公元719-756年) 杨玉环,名玉环,字太真,唐玄宗李隆基的宠妃,原名杨芙蓉(故有芙蓉出水),出生地为四川成都,祖籍山西永济。杨贵妃自小习音律,善歌舞,姿色超群。曾祖父杨汪是隋朝的上柱国、吏部尚书,唐初被李世民所杀,父杨玄琰(yǎn),是蜀州(四川崇州)司户,其叔父杨玄璬(jiǎo)曾任河南府士曹,杨玉环的童年是在四川度过的,10岁左右,父亲去世,她寄养在洛阳的三叔杨玄璬家。后来又迁往山西永乐(山西永济)。 
左迁至蓝关示侄孙湘 韩愈.
科普说明文 生物入侵者 高天群.
普及组近5年NOIP试题分析 安徽师大附中 叶国平.
专题研讨课二: 数组在解决复杂问题中的作用
文化底蕴与作文 第一节:底蕴成句 【温馨点拨】:底蕴成句是把含有文化底蕴的内容表达成句。底蕴成句有三种情况:
課程名稱:資料結構 授課老師:_____________
复习与总结.
C语言程序设计 课程 第5章 数组 主讲:李祥 博士、副教授 单位:软件学院软件工程系.
選擇排序法 通訊一甲 B 楊穎穆.
第8章 排序.
第十章 排序.
第九章 排序 概述 插入排序 交换排序 选择排序 归并排序 基数排序 外排序.
排序 Sorting.
第九章 排序 9.1排序的基本概念 9.2简单排序方法(复杂度 O(n2)) 9.3先进排序方法(复杂度 O(nLogn))
快速排序法 (Quick Sort).
第9章 排序.
第 3 讲 线性表(一).
第一章 绪论.
数 据 结 构 Ch.4 串 计 算 机 学 院 肖明军
第9章 内部排序 9.1 概述 9.2 插入排序 9.3 快速排序 9.4 选择排序 9.5 归并排序 9.6 基数排序
数据结构 Data Structure CSU 主讲人:王国军,郑瑾 中南大学信息院计科系
第 4 章 递 归 教学要求 本章重点 了解递归算法的概念与递归设计要领 掌握应用递归算法求解排序与选择、实现排列组合等典型案例
第2章 C++流程控制语句 if 语句 switch语句 for语句 while语句 do - while语句 break语句
第三节 堆及其应用.
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
C++大学基础教程 第3章 C++控制语句 北京科技大学 信息基础科学系.
ACM 程序设计(一) 主讲:朱佳 博士 华南师范大学计算机学院.
Week 2: 程式設計概念與 演算法的效能評估
经典算法之 冒 泡 排 序.
資料結構與演算法 第一章 基本概念 徐熊健 資料結構與演算法 徐熊健.
第九章 排序 概述 插入排序 快速排序 交换排序(起泡排序) 选择排序 归并排序.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
第1章 绪论(二) 教学目标 理解算法的特性及评价标准 掌握算法时间复杂度和空间复杂度的分析方法 1/
99高中資訊科選修課程 夥伴學習教師 專業進修研習 進階程式設計--演算法 教學示例與研討
代码优化.
第十章 优化 网上教学系统: : 编译原理 第十章 优化 网上教学系统: : 编译原理.
第十章 指针 指针是C语言的重要概念,是C语言的特色,是C语言的精华。 10.1 地址和指针的概念 内存中的每一个字节都有一个地址。
累堆排序法 (Heap Sort).
单片机原理及应用 实践部分 主讲人:刘 强 四川工商学院单片机教学团队 单片机原理及应用 实践部分 主讲人:刘 强
介入及追蹤紀錄表 編號: 姓/稱謂: 初次103年 月 日 追蹤 月 日 問題型態 (可複選) □ 1. 覺得西藥都很傷胃
第六章 贪心算法.
void HeapSort(int *a, int n) //堆排序 { //建立堆 for(int i = n/2-1; i >= 0; i--) //非叶节点最大序号值为n/2 HeapAdjust(a, i, n); for(int j = n-1; j >
Chap 7 数 组 7.1 排序问题 7.2 找出矩阵中最大值所在的位置 7.3 进制转换.
顺序查找与二分查找复习.
算法的基本思想: 第6章 内部排序 6.2 气泡排序 将待排序的记录看作是竖着排列的“气泡”,关键字较小 的记录比较轻,从而要往上浮。
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
排序 排序(sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。 由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机存储器中进行的排序过程;另一类是外部排序,指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中对外存进行访问的排序过程。
第二章 Java基本语法 讲师:复凡.
Presentation transcript:

中央广播电视大学开放教育试点课程 数据结构 辅导教师 倪政林

数据结构 第一章 绪论 第二章 线性表 第三章 稀疏矩阵和广义表 第四章 栈和队列 第五章 树和二叉树 第六章 二叉树的应用 第七章 图 第八章 查找 第九章 排序

第九章 排序 9.1 基本概念 1、一些重要的基本概念 排序域:用来排序的域称排序域,以后用x.stn来标识。(X为记录名) 第九章 排序 9.1 基本概念 1、一些重要的基本概念 排序域:用来排序的域称排序域,以后用x.stn来标识。(X为记录名) 2、稳定排序:对于有重码的排序域在一定的排序算法下如果其原有的顺序发生了改变则这种排序为不稳定排序,否则称稳定排序。如(23,14,45,36,23) 其稳定排序为: (14,23,23,36,45) 不稳定排序为: (14,23,23,36,45) 3、分类:内部排序和外部排序

9.2 选择排序 9.2.1、 直接选择排序:每次从未排序的表中选择 一个最小的值和其第一位元素互换位置。被换到 前面的元素不再参与下一轮的互换。 2、 举例:0 36 25 48 12 65 43 20 58 1 12 25 48 36 65 43 20 58 2 12 20 48 36 65 43 25 58 3 12 20 25 36 65 43 48 58 4 12 20 25 36 65 43 48 58 5 12 20 25 36 43 65 48 58 6 12 20 25 36 43 48 65 58 7 12 20 25 36 43 48 58 65

3、 直接选择算法设计: A={36,25,48,12,65,43,20,58} Void selecsort(elemtype A[],int n) { elemtype x; int i,j,k; for(i=1;i<=n-1;i++) {k=i-1; for(j=i; j<=n-1; j++) if( A[j].stn < A[k].stn ) k=j; if( k != i-1 ) {x=A[i-1]; A[i-1]= A[k]; A[k] = x;} }

4、 插入排序:每次从原表中选择一个元素插入到已排序的表中,在被插入的表中从后向前遍历。算法如下:原表为:a,被插入的表为b(数据结构见第二章) for(i=0;i<=a.length;i++) ( 注:初始b.length=0) { if( b.length=0) {b.length=1;b.data[b.length]=a.data[i];} Else {j = b.length; b.length++; while (b.data[j] > a.data[i]) {b.data[j+1] = b.data[j];j--;} b.data[j+1]=a.data[i]; }

5、直接选择排序和插入排序的比较 1、直接选择排序:共进行N-1次的选择和交换,每次选择需比较N-1次,其中1=<I<=N-1, 每次交换最多需移动3次记录,故 总比较次数:C=∑(n-i)=(n2-n)/2 总移动次数(最大值):M=∑3=3(n-1) 时间复杂度为:O(n2), 空间复杂度为:O(n),不稳定的排序 2、插入排序: 时间复杂度为: O(n2), 空间复杂度为:O(n2),是一种稳定的排序

9,2,2 堆排序:利用大根堆的特性进行排序的 过程。排序过程包括两部分,一是构建初始堆, 二是利用堆进行排序的过程。 1 2 3 4 5 9,2,2 堆排序:利用大根堆的特性进行排序的 过程。排序过程包括两部分,一是构建初始堆, 二是利用堆进行排序的过程。 1、图例演示 筛72,不动 45 45 1 2 36 18 36 18 3 4 5 6 53 30 48 72 53 30 48 72 93 15 36 93 15 36 7 8 9

筛53 下移一层 筛18,下移一层 45 45 36 18 36 48 93 30 48 72 53 30 18 72 53 15 36 93 15 36

筛45,下移二层 筛36 下移二层 93 45 72 48 93 48 53 30 18 53 30 18 45 72 36 36 15 15 36 36

2、排序 93与36对换 筛36,下移二层 72 36 48 53 48 72 36 30 18 53 30 18 45 45 36 36 15 15 93 93

72与15对换 15 筛15 下移两层 53 53 48 45 48 36 30 18 45 36 30 18 15 36 72 93 36 72 93

53与36对换 筛36 下移一层 36 48 45 48 45 36 36 30 18 15 36 30 18 15 53 72 93 53 72 93

48与18对换 18 筛18 下移二层 45 45 36 36 36 36 30 48 15 18 30 48 15 53 72 93 53 72 93

Void sift(elemtype a[ ] , int n, int i) {elemtype x=a[i] int j=2*i+1; 3、算法设计 3.1 筛第i位置的元素 Void sift(elemtype a[ ] , int n, int i) {elemtype x=a[i] int j=2*i+1; While(j<=n-1) { if (j<n-1 && a[j].stn < a[j+1}.stn) j++; if(x.stn<a[j].stn) {a[i]=a[j]; i=j ; j=2*i + 1;} else break; } A[i]=x; }

3.2 堆排序算法如下: Void heapsort ( elemtype a[ ] ,int n) { elemtype x; int i; for (i=n/2 -1; i >= 0; i--) sift ( a, n, i); //建立初始堆 for (i=1 ; i <= n-1 ;i++) {x=a[0]; a[0]=a[n-i]; a[n-i] = x; sift (a, n-i ,0); }

3.3 堆排序算法性能分析: 1、 筛选总次数为:n+ | n/2 |-1次 2、每次筛选的时间复杂度为O(log2n), 整个堆的筛选时间为:O(nlog2n) 3、是一种不稳定的排序。

9.3 交换排序 交换排序包括:气泡排序和快速排序 9.3.1 气泡排序:又称冒泡排序(图解如下) 1.下标0 1 2 3 4 5 6 7 9.3 交换排序 交换排序包括:气泡排序和快速排序 9.3.1 气泡排序:又称冒泡排序(图解如下) 1.下标0 1 2 3 4 5 6 7 (0) 36 25 48 12 65 43 20 58 (1) 12 36 25 48 20 65 43 58 (2) 12 20 36 25 48 43 65 58 (3) 12 20 25 36 43 48 58 65 (4) 12 20 25 36 43 48 58 65 (5) 12 20 25 36 43 48 58 65 (6) 12 20 25 36 43 48 58 65 (7) 12 20 25 36 43 48 58 65

2 气泡排序的算法设计如下: Void bubblesort(elemtype a[ ], int n ) {elemtype x; 2 气泡排序的算法设计如下: Void bubblesort(elemtype a[ ], int n ) {elemtype x; int i ,j, flag ; For(i=1;i<=n-1;i++) {flag=0; for(j=n-1;j>=I; j--) if(a[j].stn < a[j-1].stn {x=a[j]; a[j]=a[j-1]; a[j-1]=x; flag=1;} if(flag==0) break; }

3 气泡排序的算法分析: 1、平均时间复杂度为: 2、气泡排序通常比直接插入排序和直接选择排序需。 3 气泡排序的算法分析: 1、平均时间复杂度为: 2、气泡排序通常比直接插入排序和直接选择排序需。 移动较多次数的记录,所以它是三种简单排序方法中 速度最慢的一个。 3、气泡排序是稳定的。

9.3.2 快速排序:(又称划分排序) 1、思想:是目前最快的一种排序,是对气泡排序的一 种改进。它从两端向中间进行交换。(图例如下:) 9.3.2 快速排序:(又称划分排序) 1、思想:是目前最快的一种排序,是对气泡排序的一 种改进。它从两端向中间进行交换。(图例如下:) 0 1 2 3 4 5 6 7 8 9 开始: 45 53 18 36 72 30 48 93 15 36 i j 45 36 18 36 72 30 48 93 15 53 i j i j 45 36 18 36 15 30 48 93 72 53 j i 30 36 18 36 15 45 48 93 72 53 一次划分的过程

2、 算法设计: void quicksort(elemtype a[ ] ,int s, int t) { int i=s ,j=t+1; elemtype x=a[s]; do { do i++; while(a[i].stn < x.stn); do j-- ; while(a[j].stn > x.stn); if(i < j){ elemtype temp = a[i]; a[i] = a[j] ; a[j] = temp; } } while(i<j); a[s]=a[j]; a[j]=x; //以上为一个划分的过程 if (s<j-1) quicksort(a,s,j-1); if (j+1<t) quicksort(a,j+1,t); }

3、 完整图例如下: 45 53 18 36 72 30 48 93 15 36 30 36 18 36 15 45 48 93 72 53 18 15 30 36 36 45 48 93 72 53 15 18 30 36 36 45 48 93 72 53 15 18 30 36 36 45 48 53 72 93

4、 性能分析 1)是一种不稳定的排序。 2)平均和最好的情况下时间复杂度为:O(nlog2n) 其空间复杂度为:O(log2n) 4)进行改进。

9.4 归并排序 1、思想介绍:将两个或多个有序表合并成一个有 序表的过程,称二路归并(或N路归并) 2、图例如下: 9.4 归并排序 1、思想介绍:将两个或多个有序表合并成一个有 序表的过程,称二路归并(或N路归并) 2、图例如下: 开始: 0: 45 53 18 36 72 30 48 93 15 36 1: 45 53 18 36 30 72 48 93 15 36 2: 18 36 45 53 30 48 72 93 15 36 3: 18 30 36 45 48 53 72 93 15 36 4: 15 18 30 36 36 45 48 53 72 93

3、 将两个有序表进行两路归并算法如下: void twomerge(elemtype a[ ] , elemtype r[ ] , int s, int m, int t) { int i , j , k ; i=s ; j=m+1 ; k=s ; while( i<=m && j<=t ) if(a[i].stn <= a[j].stn) {r[k] = a[i] ; i++ ; k++ ;} else{ r[k] = a[j]; j++; k++;} while (i <= m) {r[k]=a[i]; i++; k++;} while(j <= t) {r[k] = a[j]; j++; k++;} }

4、对若干个有序表进行一趟二路归并排序 void mergepass(elemtype a[ ] , elemtype r[ ] , int n, int len ) {int p=0; while(p+2*len-1 <= n-1 ) {twomerge(a, r, p, p+len-1, p+2*len-1 ) ; p+ = 2*len ; } if(p+len-1 < n-1) twomerge(a , r , p , p+len-1 , n-1 ); else for(int i = p; i<=n-1; i++ ) r[i]=a[i]; }

Void mergesort (elemtype a[ ],int n) { elemtype *r=new elemtype[n]; 5、 两路归并的总算法如下: Void mergesort (elemtype a[ ],int n) { elemtype *r=new elemtype[n]; int len=1 while(len<n) { mergepass(a,r,n,len) len*=2; mergepass(r,a,n,len); len*=2; } delete [ ] r;} 6、性能分析:时间复杂度为:O(nlog2n) 空间复杂度为:O(n) (最高) 排序是稳定的。

1、当待排序的记录数较大时,排序码分布较随机, 2、当待排序的记录数较大时,内存空间允许,且要求 总结: 1、当待排序的记录数较大时,排序码分布较随机, 对稳定性不作要求时,采用快速排序为宜。 2、当待排序的记录数较大时,内存空间允许,且要求 排序稳定时,采用归并排序为宜。 3、当待排序的记录数较大时,排序码分布可能会出现 正序或逆序的情况,且对稳定性不作要求时,采用 堆排序(或归并排序)为宜。 4、当待排序记录数较小,记录或基本有序(即正序) 或分布较随机,且要求稳定时,采用直接插入排序为宜。 5、当待排序记录数较小,对稳定不作要求时,采用直 接选择排序为宜,若排序码不接近逆序,亦可采用 直接插入排序。