第八章 排序技术

第八章 排序技术排序是数据处理中经常使用的一种操作,其主要目的是便于查找学习重点:①各种排序算法的基本思想;②各种排序算法的执行过程;③各种排序算法的设计;④各种排序算法时间复杂度的分析;⑤各种排序算法之间的比较;学习难点:①快速排序、堆排序、归并排序、基数排序等算法;②快速排序算法的时间复杂度分析。8.1 概述8.1.1排序的基本概念在排序问题中,通常将数据元素称为记录。排序给定一个记录序列(r1,r2,r3……rn),其相应的关键码分别为(k1,k2,k3…,kn),排序是将这些记录排序成顺序为(rs1,rs2,rs3……rsn)的一个序列,使得到相应的关键码满足ksi≤ks2≤…≤ksn(升序)或ksi≥ks2≥…≥ksn(降序)。简言之,排序是将一个记录的任意序列重新排列成一个按关键码有序的序列。 从操作角度看,排序时线性结构的一种操作,待排序记录可以用顺序存储结构或链接存储结构存储。不失一般性,为突出排序方法的主题,本章讨论的排序算法均采用顺序存储结构,并假定关键码为整型,且记录只有关键码一个数据项,即采用一微整型数组实现,数组的长度为n+1(下标为0处留作他用)。另外,假定排序都是将待排序的记录序列排序为升序序列。正序、逆序若待排序序列中的记录已按关键码排好序,称此记录序列为正序;若待排序序列中记录的排列顺序与排好序的顺序正好相反,称此记录序列列为逆序或反序。趟在排序过程中,将待排序的记录序列扫描一遍称为一趟。在排序操作中,深刻理解趟的含义能够更好地掌握排序方法的思想和过程。排序算法的稳定性假定在待排序的记录序列中,存在多个具有相同关键码的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ki=kj,且ri在rj之前,在排序后的序列中,ri仍在rj之前,则称这种排序算法稳定;否则称为不稳定。排序的分类根据在排序过程中待排序的所有记录是否全部被放置在内存中,可将排序方法分为内排序和外排序两大类。内排序是指在排序的整个过程中,待排序的所有记录全部被放置在内存中;外排序是指由于待排序的记录个数太多,不能同时放置在内存,而需要将一部分记录放置在内存,另一部分记录放置在外存,整个排序过程需要在内外存之间多次交换数据才能得到排序的结果。8.1.2排序算法的性能排序时数据处理中经常执行的一种操作,往往属于系统的核心部分,因此排序算法的时间开销是衡量其好坏的最重要的标志。对于基于比较的内排序,在排序过程中通常需要进行下列两种基本操作:①比较,关键码之间的比较;②移动,记录从一个位置移动到另一个位置。所以,在待排序的记录个数一定的条件下,算法的执行时间主要消耗在关键码之间的比较和记录的移动上。因此,高效率的排序算法应该具有尽可能少的关键码比较次数和尽可能少的记录移动次数。评价排序算法的另一个主要标准是执行算法所需要的辅助存储空间。辅助存储空间是指在待排序的记录个数一定的条件下,除了存放待排序记录占用的存储空间之外,执行算法所需要的其他存储空间。8.2插入排序8.2.1直接插入排序直接插入排序是插入排序中最简单的排序方法。其基本思想是:依次将待排序序列中的每一个记录插入到一个已排好序的序列中,知道全部记录都排好序。在直接插入排序中,需解决的关键问题是:⑴如何构造初始的有序序列?⑵如何查找待插入记录的插入位置?直接插入排序算法void InsertSort(int r[ ], int n){for (i=2; i<=n; i++){r[0]=r[i];for(j=i-1;r[0]=1; d=d/2){for (i=d+1;i<=n; i++){r[0]=r[i];for (j=i-d; j>0 && r[0]=1;i--)sift(r,i,n);for(i=1;i

你可能感兴趣的:(第八章 排序技术)