第七章 排序.ppt

第七章 排序

第七章 排 序 内容 基本概念 插入排序 交换排序 选择排序 归并排序 分配排序 各种排序方法的比较 7.1 基本概念 排序(sorting)是计算机科学的重要课题,在许多由计算机处理的问题中,大约有50%以上的时间花费在排序上,很多计算机算法都与排序有关。 7.2 插入排序 插入排序 Insertion sorting 的基本思想: 设待排序的表为 r1,r2,…….,rn ,把记录ri 2≤i≤n 插入到它前面已排好序的 i-1个记录 r1,r2,…….,ri-1 1≤i≤n 中,使得表的前I个记录 也成为排好序的。 直接插入排序图示 7.2.3 希尔排序 算法先将表中诸记录按某个增量d分为若干组,每组中 相邻记录的位置相差d,对每组记录用某种方法进行排序, 然后再用较小的增量对表中记录进行分组,对每一组再 进行排序,…….。当增量减为1时,整个表中记录被分为 1组,由于分组增量是逐渐减小的,所以希尔排序又称为 渐减增量排序。 7.3 交换排序 7.3.1 起泡排序 起泡排序算法 void Bubblesort SqList L bool done FALSE; for int j 1; j L.length-1!done; j++ done TRUE; for int i 1; i L.length-j; i++ if L.r[i+1].key L.r[i].key rectype temp L.r[i]; L.r[i] L.r[i+1]; L.r[i+1] temp; done FALSE; 7.3.2 快速排序 快速排序 Quick sort 是目前内排序算法中平均性能最好 的排序方法,它的基本思想是选取被排序表中某个关键码作 为基准 pivot ,将表划分成左右两个子表: 左子表中各记 录的关键码均小于或等于基准值,而右子表中各记录的关 键码均大于或等于基准值。然后以同样的方法递归地处理 这两个子表,直到完成全部记录的排序。 例如对含有13个记录的表 r1, r2, …. , r13 进行划分的过 程,取中间一个记录的关键码275作为基准,划分时用两 个指针i和j扫描表,指针i从表头向右端扫描,直至遇到一 个关键码值大于或等于基准的记录;指针j从表尾向左端扫 描,直至遇到一个关键码值小于或等于基准的记录。接着 交换ri,和rj,然后 i和j继续沿原方向相下扫描、比较、交换。 当i和j交叉时,表中各记录都与基准比较过,表被划分为 成左右两个子表,左子表中各记录的关键码均小于或等于 基准值。 7.4 选择排序 选择排序 Selection sort 是从待排序的表 含n个记录 中先选出关键码最大或最小的记录,将它放到第n 或第1 个位置上,然后从其余n-1个记录中选出关键码最大或最小的记录,将它放到第n-1 或第2 个位置上,…..,直到选择了n-1个记录。 7.4.2 堆排序 为了避免直接选择排序时相邻两趟扫描中的某些重复比 较,可以采用树形选择方法:设待排序表中的n 设为2的幂 个记录的关键码为k1≤ k2 ≤ ……. ≤ kn,先比较k1:k2, k3:k4,..……., Kn-1: kn ,选出每对中的较大者;再用同样的 方法比较选出的每对中的较大者,直至选出最大的关键码。 找到最大的关键码,将记录选出,并用 -∞代替原记录 中的关键码,继续比较, 直到所有记录按大到小的次序选 出为止。 显然,对n个关键码,选取最大的关键码所构成树的深度为?log2n?即为比较次数,整个过程的比较次数为 n-1 + n-1 * ?log2n?-1 ?n*?log2n? 7.5 归并排序 归并排序 Merge sort 的基本思想是通过归并两个以上已排序好的表成为一个有序表。设L1和L2均是已排序好的表,归并这两个表生成有序表L3的过程如下: 归并两个有序表的算法 void Merge rectype SR[],rectype TR[],int i, int m, int n //将有序表SR[i..m]和SR[m+1..n]归并为有序表TR[i..n] int j, k; for j m+1,k i; i mj n; k++ if SR[i].key SR[j].key TR[k] SR[i++]; else TR[k] SR[j++]; while i m TR[k++] SR[i++]; while j n TR[k++] SR[j++]; 算法分析 每次合并的比较次数不超过被合并的项数, 整个归并需要对所有产生的子表进行归并, 而所有这些子表的总长度恰好为n, 归并排序总的时间复杂度为O nlog2n 。 归并排序算法是稳定的。 7.5 基数排序 基数排序 Radix

文档评论(0)

1亿VIP精品文档

相关文档