- 0
- 0
- 约1.04万字
- 约 10页
- 2018-02-28 发布于浙江
- 举报
[工学]chenz_DSA_PPT_Slides_ch10
数据结构A ·第10章 班 级 :B080308-10 任课教师 :陈志老师 上课地点和时间 (1)教2-410:星期2,下午第3大节 (2)教2-512:星期5,上午第1大节 第10章 内排序 引 言 排序是将一个数据元素的序列调整为按指定关键字值递增(或递减)次序排列的有序序列的过程。 第10章 内排序 内容提要 1、内排序的基本概念; 2、简单排序算法; 3、快速排序算法; 4、两路合并排序。 第10章 内排序 10.1 内排序的基本概念 10.1 内排序的基本概念 10.1 内排序的基本概念 10.1 内排序的基本概念 10.2 简单排序算法 10.2 简单排序算法 10.2 简单排序算法 10.2 简单排序算法 10.2 简单排序算法 10.2 简单排序算法 10.2 简单排序算法 10.2 简单排序算法 10.2 简单排序算法 10.2 简单排序算法 10.2 简单排序算法 10.2 简单排序算法 10.2 简单排序算法 10.2 简单排序算法 10.2 简单排序算法 10.2 简单排序算法 10.3 快速排序(1960年) 10.3 快速排序 10.3 快速排序 10.3 快速排序 10.3 快速排序 10.3 快速排序 10.3 快速排序 10.3 快速排序 10.4 两路合并排序(1945年) 10.4 两路合并排序 10.4 两路合并排序 10.4 两路合并排序 10.4 两路合并排序 10.4 两路合并排序 10.4 两路合并排序 10.5 堆排序 10.5 堆排序 10.5 堆排序 10.5 堆排序 10.5 堆排序 10.5 堆排序 10.5 堆排序 10.5 堆排序 第10章 内排序 第10章 内排序 template class T void QuickSort(T A[],int n) { A[n]=maxnum; QSort(A,0,n-1); } 从上述快速排序算法中可以看出: 经过每一趟排序后,若被分割成两个大小相近的子序列时,快速排序的效率最好,时间复杂度为O(nlog2n); 反之,若每次分割的两个子序列中有一个为空,即初始序列有序(顺序或逆序),则效率最低,时间复杂度为O(n2)。 快速排序是不稳定的排序方法。 为避免发生最坏情况,选择分割元素时可作三种处理: (1)将A[(left+right)/2]作为分割元素,与A[left]交换; (2)选left到right间的随机整数k,将A[k]与A[left]交换; (3)取A[left]、A[(left+right)/2]和A[right]之中间值与A[left]交换。 提高快速排序的效率: (1) 将递归程序改为非递归 (2) 先对短的子序列排序,长的子序列后排序 约翰·冯·诺伊曼 /wiki/Merge_sort 基本思想:将有n个元素的序列看成是n个长度为1的有序子序列,然后两两合并子序列,得到?n/2?个长度为2或1的有序子序列;再两两合并,…,直到得到一个长度为n的有序序列时结束。 48 36 68 72 12 48 02 size=1 i1 j1 i2 j2 第一趟排序; 36 48 68 72 12 48 02 size=2 i1 i2 第二趟排序; j1 j2 此时i1+sizen的条件已经不满足,第一趟扫描结束; 此时的状态,适合展示排序的细节,请注意! Temp 48 36 68 72 12 48 02 size=4 i1 j1 i2 j2 先按从小到大的顺序放到Temp数组中,然后再写回A[]; 第三趟排序;过程同前 (略);每一趟size以2倍增加,当 size = n 时排序结束; 将两个子序列 (A[i1], A[i1+1],…, A[j1]) (A[i2], A[i2+1],…, A[j2]) 合并为一个子序列,保存在数组Temp从k开始的位置 (Temp[k],Temp[k+1],…,Temp[j1-i1+j2-i2+1+k])。 …… i1 …… j1 i2 …… j2 A …… k Temp kk=(j1-i1+j2-i2+1+k) 程序10-5 两路合并的C++程序 template class T void Merge(T A[], int i1, int j1, int i2, int j2) { T *Temp=new T[j2-i1+1]; int i=i1, j=i2, k=0; while (i=j1 j=j2) {
原创力文档

文档评论(0)