i-1,a
i
>|a
i-1
,a
i
∈D.i = 2,……,n}
基本操作:
SelectListType(c)
操作结果:打印提示信息,请用户选择待排序表的类型,顺序型、
逆序型还是随机数组。
BubbleSort(&L)
操作结果:进行起泡排序,返回排序后的顺序表
InsertSort(&L)
操作结果:进行插入排序,返回排序后的顺序表
SelectSort(&L)
操作结果:进行选择排序,返回排序后的顺序表
QuickSort(&L)
操作结果:进行快速排序,返回排序后的顺序表
ShellSort(&L)
操作结果:进行希尔排序,返回排序后的顺序表
HeapSort(&L)
操作结果:进行堆排序,返回排序后的顺序表
SelectSortMethod(&L,c1)
操作结果:打印提示信息,请用户选择排序方法,起泡排序、插入
排序、选择排序、快速排序、希尔排序还是堆排序
OutPut(L)
操作结果:打印排序中关键字的比较次数和移动次数
}ADT OrderableList
2.本程序包含两个模块:
1).主程序模块
int mian()
{
初始化;
用户选择待测表的类型;
输入选择,用switch语句判断;
While(“命令”!= “退出”)
{
接受命令;
处理命令;
}
}
2).可排序表单元模块----实现可排序表的抽象数据类型
各模块之间的调用关系:
主程序模块
可排序表单元模块
三、详细设计
1.根据题目要求何可排序表的基本操作特点,可排序表采用证书顺序表存储结构,并实现在头文件SqList.H。
//******************基本操作的函数原型******************\\
#define MAXSIZE 20 //用作示例的顺序表的最大长度typedef int KeyType; //定义关键字为整数类型
typedef int InfoType; //定义其他数据项也为整数类型int time_key_compare = 0; //定义全局变量,关键字比较次int time_key_move = 0; //数和移动次数均为0
typedef struct
{
KeyType key; //关键字项
InfoType otherinfo; //其他数据项
}RedType; //记录类型
typedef struct
{
RedType r[MAXSIZE + 1]; //r[0]闲置或用做哨兵
int length; //顺序表长度
}SqList; //顺序表类型
//****************************基本操作*********************\\ bool LT(KeyType a,KeyType b)//比较两个KeyType类型变量的大小{
time_key_compare ++; //比较次数+1
if(a < b)
return true; //<,返回true else
return false; //否则,返回false
void copyKey(RedType &a,RedType &b)
{ //将RedType类型变量b复制给a
a = b;
time_key_move ++; //关键字移动次数+1 }//copyKey
void swap(RedType &a,RedType &b)
{ //将RedType型变量a和b进行交换操作RedType c; //定义RedType型变量c
c = a;
a = b;
b = c;
time_key_move += 3; //关键字移动次数+3 }//swap
/****************直接插入排序*********************\
void InsertSort(SqList &L)
{ //对顺序表L做直接插入排序for(int i = 2; i <= L.length; ++i)
{
if(LT(L.r[i].key,L.r[i - 1].key))
{ //“<”,需将L.r[i]插入有序子表copyKey(L.r[0] ,L.r[i]); //复制为哨兵
copyKey(L.r[i] ,L.r[i - 1]);
for(int j = i - 2;LT(L.r[0].key,L.r[j].key); --j)
{
copyKey(L.r[j + 1] ,L.r[j]); //记录后移
}
copyKey(L.r[j + 1] ,L.r[0]); //插入到正确的位置}
}
}//InsertSort
//*************************希尔排序*************************\ void shellInsert(SqList &L,int dk)
{ //对顺序表L做一希尔插入排序。
//1.前后记录位置的增量式是dk,而不是1;
//2.r[0]只是暂存单元,不是哨兵。当 j<= 0时,插入位置已找到for(int i = dk + 1;i <= L.length; ++i)
{
if(LT(L.r[i].key,L.r[i - dk].key))
{ //需将L.r[i]插入到有序增量子表copyKey(L.r[0] ,L.r[i]); //暂存在L.r[0]中
for(int j = i - dk;j > 0 && LT(L.r[0].key,L.r[j].key); j-= dk)
copyKey(L.r[j + dk] ,L.r[j]); //记录后移
copyKey(L.r[j + dk] ,L.r[0]); //插入