各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。
2.2基本要求:
(1) 对以下6种常用的内部排序算法进行对比:直接插入排序;希尔排序;起泡排序;快速排序;简单选择排序;堆排序;
(2) 待排序表的表长不少于100;其中的数据要用伪随机数产生程序产生;至少要用5组不同的输入数据作比较;对比的指标为关键字比较次数和关键字移动次数(1次关键字交换计为3次移动)。
(3) 测试数据由随机函数产生。
2.3概要设计
2.3.1核心程序:排序的六种算法
1)希尔排序:将整个待排序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。
Void ShellSort(SortData* sd, int dlta[], int t,int* CmpNum, int* ChgNum)
操作结果:对待排序列进行插入和希尔排序。
2)快速排序:通过一趟排序将记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
void QSort (SortData* sd, int low, int high, int* CmpNum, int* ChgNum)
操作结果:对待排序列进行快速排序。
3)堆排序:是记录序列按关键字非递减有序排列,则在堆排序的算法中先建一个“大顶堆”,技先选得一个关键字最大得为最大的记录并与序列中最后一个记录交换,然后对序列中前n-1个记录进行筛选,重新将它调整为一个“大顶堆”,如此反复,知道排序结束。
void HeapAdjust (SortData* sd,int s, int m, int* CmpNum, int* ChgNum)
操作结果:对待排序列进行堆排序。
4)冒泡泡排序:第i趟起泡排序是从L.r[1]到L.r[n-i+1]依次比较相邻两个记录的关键字,并在“逆序”时交换相邻记录,其结果是在n-i+1个记录中关键字最大的记录被交换到第n-i+1的位置上,整个排序过程需进行k(1<=k<n)趟起泡排序,判别起泡排序结束的条件应该是 “在一趟排序过程中没有进行过交换记录的操作”。
void BubbleSort(SortData* sd, int* CmpNum, int* ChgNum)
操作结果:对待排序列进行一趟冒泡排序。
5)简单选择排序:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和的i(1<=i<n)个记录交换之,如此重复,直到排序结束。
void SelSort(SortData* sd, int* CmpNum, int* ChgNum)
操作结果:对待排序列进行选择排序。
2.3.2一些初始化函数如下:
void RandomNum(BOOL boolen) 操作结果:生成排序列。
void InitSortData(SortData*sd,BOOL boolen)操作结果:初始化L,当boolen=TRUE生成,boolen=FALSE生成随机排序列。
void RandomizeSortData(SortData* sd,int d )
操作结果:随d的值不同程度打乱排序表。
void RecallSortData(SortData* sd) 操作结果:随机数列复位。
2.3.3七大模块的函数:
void InsertSort( ) //调用插入排序并输出数据
void ShellSort( ) //调用希尔排序并输出结果
void QuickSort( ) //调用快速排序并输出结果
void HeapSort( ) //调用堆排序并输出结果
void BubbleSort( ) //调用一趟冒泡排序并输出结果
void SelectSort( ) //调用选择排序并输出结果
2.4详细设计
2.4.1 插入排序
void InsertSort()
{
int CmpNum,ChgNum,TempTime,SpendTime;
int i;
int Indata[1]={1}; //插入排序是希尔排序的特例
SortData sd;
InitSortData(&sd,TRUE);
Display(&sd);
printf("插入排序:\n\n");
printf("测试\t比较次数\t\t交换次数\t时间\n");
for(i=0;i<9;i++)