没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
程序源代码:(本程序用 VC2010 编写 请用 6.0 的同学修改下主函数申明)
// 题目 7.cpp : 定义控制台应用程序的入口点。
//
/*7.内部排序算法的性能分析【问题描述】
设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。
【基本要求】
(1)对起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序进行比较;
(2)待排序表的表长不小于 100,表中数据随机产生,至少用 5 组不同数据作比较,比较指
标有:关键字参加比较次数和关键字的移动次数(关键字交换记为 3 次移动);
(3)输出比较结果。
【选做内容】
(1)对不同表长进行比较;
(2)验证各算法的稳定性;
(3)输出界面的优化。*/
#include "stdafx.h"
#include<iostream>
#include<iomanip>
#include<string>
#include<ctime>
#include<cstdlib>
using namespace std;
#define MAXSIZE 200 //序列表的最大长度
typedef int keytype; //定义关键字类型为整数类型
typedef struct
{
keytype key; //关键字项
}redtype; //记录类型
typedef struct
{
redtype r[MAXSIZE+1]; //r[0]闲置活用作哨兵
int length; //顺序表长度
}Sqlist;
Sqlist L; //定义一个全局的 Sqlist 类型变量 L
Sqlist G; //定义一个特定的全局变量用来验证稳定性
int csum[10]={0},msum[10]={0},t[10]={0};//总体的比较和移动次数
int m,sct=0,smt=0,qct=0,qmt=0,mct=0,mmt=0; //sct 表示希尔类型的关键字比较次数,smt 表
示希尔类型的关键字移动次数,q 和 m 分别代表快速和归并
bool w=true; //表示稳定的指标
int language;
void welcome(); //欢迎界面函数
bool check(); //用户登录函数
void suiji(); //随机数发生函数
void bublesort(Sqlist L); //起泡排序函数
void selectsort(Sqlist L); //简单选择排序函数
void insertsort(Sqlist L); //直接插入排序函数
void shellinsert(Sqlist &L,int dk);//做一趟希尔排序
void shellsort(Sqlist L); //希尔排序函数
int partition(redtype R[],int low,int high);//获取快速排序的枢轴函数
void qsort(redtype[],int s,int t);//快速排序函数
void quicksort(Sqlist L); //快速排序函数
void merge(redtype SR[],redtype TR[],int i,int m,int n);//将有序的 SR[i...m]和 SR[m+1..n]归并
为有序的 TR[i...n]
void msort(redtype SR[],redtype TR1[],int s,int t);//将 SR[s....t]归并排序为 TR1[s..t]
void mergesort(Sqlist L); //归并排序函数
void output(Sqlist L,int ct,int mt); //输出函数
bool judge(redtype a,redtype b); //稳定性判断函数
void judgeoutput(bool w); //稳定性结果输出函数
void initialize(Sqlist &G,int m); //初始化用语测定稳定性的数组
void summarize(); //总结统计函数
void single(int a,int b,int c); //单个总结输出函数
void chinese(); //中文输出
void english(); //英文输出
int _tmain(int argc, _TCHAR* argv[])
{
cout<<endl;
cout<<"_______________________________________________________________"<<endl;
cout<<"language choose(语言选择):";
cout<<"(1-Chinese(中文) 2-English(英文))"<<endl;
cout<<"-------------choice(选项):";
cin>>language;
cout<<"---------------------------------------------------------------"<<endl;
cout<<endl;
loop:switch(language)
{
case 1:
chinese();
break;
case 2:
english();
break;
default:
cout<<"_______________________________________________________________"<<endl;
cout<<"ERROR(错误)!"<<endl;
cout<<"language choose(语言选择):";
cout<<"(1-Chinese(中文) 2-English(英文))"<<endl;
cout<<"please input again(请再次输入指令):";
cin>>language;
cout<<endl;
goto loop;
}
return 0;
}
void bublesort(Sqlist L) //冒泡排序函数,实现函数由小到大的排序
{
int i,j,mt=0,ct=0;
redtype temp;
L.length=m;
w=true;
t[0]++;
for(i=1;i<=L.length-1;++i)
{
for(j=1;j<=L.length-i;++j)
{
ct++;
if(L.r[j+1].key<L.r[j].key)//将一个数和它后面的紧接着的一个数比较选出较小
的数下沉
{
temp=L.r[j];
L.r[j]=L.r[j+1];
L.r[j+1]=temp; //把较大的数交换到较高的端位
mt+=3; //移动次数加 3,(关键字交换记为 3 次移动)
judge(L.r[j],L.r[j+1]);
}
}
}
csum[0]=ct+csum[0];
msum[0]=mt+msum[0];
if(language==1)
{
cout<<"(冒泡排序)_"<<endl;
}
else
{
cout<<"(BubleSort)_"<<endl;
}
output(L,ct,mt);
}
void selectsort(Sqlist L) //简单选择排序函数,实现函数由小到大的排序
{
int i,j,k,ct=0,mt=0;
redtype temp;
L.length=m;
w=true;
t[1]++;
for(i=1;i<=L.length-1;++i)
{
k=i;
for(j=i+1;j<=L.length;++j)
{
ct++;
if(L.r[j].key<L.r[k].key)
{
k=j; //选择出最小记录的位置
}
}
if(k!=i)
{
temp=L.r[i];
L.r[i]=L.r[k];
L.r[k]=temp; //将第 i 个记录和第 k 个记录进行交换
mt+=3; //移动次数加 3,(关键字交换记为 3 次移动)
}
judge(L.r[i],L.r[k]);
}
csum[1]=ct+csum[1];
msum[1]=mt+msum[1];
if(language==1)
{
cout<<"(简单选择排序)_"<<endl;
}
else
{
cout<<"(SelectSort)_"<<endl;
}
output(L,ct,mt);
}
void insertsort(Sqlist L) //直接插入排序函数,实现函数由小到大的排序
{
int i,j,ct=0,mt=0;
L.length=m;
w=true;
t[2]++;
for(i=2;i<=L.length;i++)
{
++ct;
if(L.r[i].key<L.r[i-1].key)
{
L.r[0]=L.r[i]; //复制为哨兵
++mt; //关键字移动次数加 1
for(j=i-1;L.r[0].key<L.r[j].key;--j,ct++)
{
L.r[j+1]=L.r[j];//记录后移
++mt;
}
L.r[j+1]=L.r[0]; //插入到正确的位置
++mt;
}
}
csum[2]=ct+csum[2];
msum[2]=mt+msum[2];
if(language==1)
{
cout<<"(直接插入排序)_"<<endl;
}
else
{
cout<<"(InsertSort)_"<<endl;
}
output(L,ct,mt);
}
void shellinsert(Sqlist &L,int dk) //一趟希尔排序函数,基本实现函数由小到大的排序
{
int i,j;
L.length=m;
for(i=1+dk;i<=L.length;++i)
{
judge(L.r[i],L.r[i-dk]);
sct++; //关键字比较次数加 1
if(L.r[i].key<L.r[i-dk].key) //需将 L.r[0]插入有序增量子表
{
L.r[0]=L.r[i]; //暂存在 L.R[0]
剩余24页未读,继续阅读
苏州周杰伦
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0