文档详情

第九章 排序 数据结构(用面向对象的方法与C 语言描述)(第2版)课件.ppt

发布:2016-11-16约3.32万字共139页下载文档
文本预览下载声明
第九章 排序 清华大学计算机系 第九章 排序 概述 插入排序 交换排序 选择排序 归并排序 基数排序 概述 排序:将一组杂乱无章的数据按一定的规律顺次排列起来。 数据表(datalist): 它是待排序数据元素的有限集合。 排序码(key): 通常数据元素有多个属性域, 即多个数据成员组成, 其中有一个属性域可用来区分元素, 作为排序依据。该域即为排序码。每个数据表用哪个属性域作为排序码,要视具体的应用需要而定。 排序算法的稳定性: 如果在元素序列中有两 个元素r[i]和r[j], 它们的排序码 k[i] == k[j] , 且在排序之前, 元素r[i]排在r[j]前面。如果在排序之后, 元素r[i]仍在元素r[j]的前面, 则称这个排序方法是稳定的, 否则称这个排序方法是不稳定的。 内排序与外排序: 内排序是指在排序期间数据元素全部存放在内存的排序;外排序是指在排序期间全部元素个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内、外存之间移动的排序。 排序的时间开销: 排序的时间开销是衡量算法好坏的最重要的标志。排序的时间开销可用算法执行中的数据比较次数与数据移动次数来衡量。 算法运行时间代价的大略估算一般都按平均情况进行估算。对于那些受元素排序码序列初始排列及元素个数影响较大的,需要按最好情况和最坏情况进行估算。 算法执行时所需的附加存储: 评价算法好坏的另一标准。 待排序数据表的类定义 #include iostream.h const int DefaultSize = 100; template class T class Element { //数据表元素定义 public: T key; //排序码 field otherdata; //其他数据成员 ElementT operator = (ElementT x) { key = x.key; otherdata = x.otherdata; return this; } bool operator == (ElementT x) { return key == x.key; } //判*this与x相等 bool operator = (ElementT x) { return key = x.key; } //判*this小于或等于x bool operator = (ElementT x) { return key = x.key; } //判*this大于或等于x bool operator (ElementT x) { return key x.key; } //判*this大于x bool operator (ElementT x) { return key x.key; } //判*this小于x }; template class T class dataList { //数据表类定义 private: Element T* Vector; //存储排序元素的向量 int maxSize; //向量中最大元素个数 int currentSize; //当前元素个数 public: datalist (int maxSz = DefaultSize) : //构造函数 maxSize(maxSz), currentSize(0) { Vector = new ElementT[maxSize]; } int Length() { return currentSize; } //取表长度 void Swap (ElementT x, ElementT y) { ElementT temp = x; x = y; y = temp; } ElementT operator [](int i) //取第i个元素 { return Vector[i]; } int Partition (const int low, const int high); //快速排序划分 }; 插入排序 (Insert Sorting) 基本方法是:每步将一个待排序的元素,按其排序码大小,插入到前面已经排好序的一组元素的适当位置上, 直到元素全部插入为止。 基本思想是 : 当插入第i (i≥1) 个元素时,前面的V[0], V[1], …, V[i-1
显示全部
相似文档