1、实验内容:
用随机函数生成16个2位正整数(10~99),实现插入排序、选择排序、冒泡排序、双向冒泡、快速排序、二路归并排序等多种排序算法,输出排序中间过程、统计关键字的比较次数和记录的移动次数。
2、实现代码:
//用随机函数生成16个2位正整数(10~99),
//实现插入排序、选择排序、冒泡排序、双向冒泡、快速排序、二路归并排序等多种排序算法,
//输出排序中间过程、统计关键字的比较次数和记录的移动次数。
#include <iostream>
#include<time.h>
using namespace std;
#define MAXSIZE 20 //顺序表的最大长度
int com, mov; //比较次数and移动次数
typedef struct
{
int key; //关键字
char *otherinfo;
}ElemType;
//顺序表的存储结构
typedef struct
{
ElemType r[MAXSIZE + 1]; //存储空间的基地址
int length; //顺序表长度
}SqList; //顺序表类型
//随机生成16个2位正整数
void Create_Sq(SqList &L)
{
com = mov = 0; //初始化移动次数和比较次数为0
srand(int(time(0)));//建立时间种子
cout << "随机生成的数:" << endl;
for (int i = 1; i < L.length + 1; i++)//根据顺序表长度插入关键字
{
L.r[i].key = rand() % 90 + 10;//随机生成1-100的整数
//L.length++;
cout << L.r[i].key << " ";//输出排序前的整数
}
cout << endl;
}
void show(SqList L) //输出数据(排序后的数据)
{
int i;
for (i = 1; i <= L.length; i++)
cout << L.r[i].key << " ";
}
//对顺序表L做直接插入排序
void InsertSort(SqList &L)
{
Create_Sq(L);
int i, j;
cout << "直接插入排序的过程: " << endl;
for (i = 2; i <= L.length; ++i)
{
if (L.r[i].key < L.r[i - 1].key)
{
//"<",需将r[i]插入有序子表
L.r[0] = L.r[i]; //将待插入的记录暂存到监视哨中
L.r[i] = L.r[i - 1]; //r[i-1]后移
for (j = i - 2; L.r[0].key < L.r[j].key; --j) //从后向前寻找插入位置
L.r[j + 1] = L.r[j]; //记录逐个后移,直到找到插入位置
L.r[j + 1] = L.r[0