- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
概述
插入排序
交换排序
选择排序
归并排序
基数排序
第九章 排序
概述
排序:将一组杂乱无章的数据按一定的规律顺次排列起来。
数据表(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 dataList { //数据表类定义
private:
T* Vector; //存储排序元素的向量
int maxSize; //向量中最大元素个数
int currentSize; //当前元素个数
public:
dataList (int maxSz = DefaultSize) : //构造函数
maxSize(maxSz), currentSize(0)
{ Vector = new T[maxSize]; }
int Length() { return currentSize; } //取表长度
void Swap (T x, T y)
{ T temp = x; x = y; y = temp; }
T 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]已经排好序。这时,用V[i]的排序码与V[i-1], V[i-2], …的排序码顺序进行比较,找到插入位置即将V[i]插入,原来位置上的元素向后顺移。
直接插入排序 (Insert Sort)
各趟排序结果
i = 1
i = 2
0 1 2 3 4 5
i = 4
i = 5
i = 3
i = 4 时的排序过程
完成
i = 4
j = 2
25
16
0 1 2 3 4 5 temp
21
49
25*
08
16
25
i = 4
j = 1
i = 4
j = 0
i = 4
j = -1
直接插入排序的算法
#include dataList.h
template class T
void InsertSort (dataListT L, int left, int right) {
//依次将元素L.Vector[i]按其排序码插入到有序表
//L.Vector[left],…,L.Vector[i-1]中,使得
//L.Vector[left]到L.Vector[i]有序。
T temp; int i, j;
for (i = left+1; i = right; i++)
if (L[i] L[i-1]) {
temp = L[i]; j = i-1;
文档评论(0)