算法设计实验报告一_

  • 格式:pdf
  • 大小:420.27 KB
  • 文档页数:8

算法设计实验报告

一、实验内容:

题目:题目:11、

编程实现常见排序算法,如插入排序、归并排序、快速排序、随机化的快速排

序等,并统计不同输入规模下(序等,并统计不同输入规模下(11组从小到大排序,组从小到大排序,11组从大到小排序,其余组从大到小排序,其余88组随机)的平均物理执行时间。

2、

编程实现循环赛日程表

设有设有n=2kn=2kn=2k个运动员要进行网球循环赛,先要设计一个满足一下要求的比赛日常表:个运动员要进行网球循环赛,先要设计一个满足一下要求的比赛日常表:

(1)每个选手必须与其他)每个选手必须与其他n-1n-1n-1个选手各赛一次个选手各赛一次

(2)每个选手一天只能赛一次

(3)循环赛一共进行n-1天

二、核心代码说明:

1、 sort.h

template

struct SqList{

type * key;

int length;

};

template

void CreateSqList(SqList &> &slsl)//type为int

{

int n;

cout<

请输入顺序表的长度"<

cin>>n;

sl.length=n;

sl.key=.key=newnew

int[sl.length+1];

assert(sl.key);

srand(time(0));

for(int i=1;i<=sl.length;i++)

{

sl.key[i]=rand();

}

}

template

void OutPut(SqList &> &LL)

{

for(int j=1;j<=L.length;++j)

cout<

cout<

}

//折半插入排序

template void BInsertSort(SqList &> &LL)

{

int high,low,m; for(int i=2;i<=L.length;i++)

{

L.key[0]=.key[0]=LL.key[i];.key[i];////

将L.key[i]

暂存到L.key[0]

low=1;

high=i-1;

while(low<=high)(low<=high)////

在key[low]

到key[high]

中折半查找有序插

入的位置

{

m=(low+high)/2;m=(low+high)/2;////

折半

if(L.key[0]<=.key[0]<=LL.key[m])

high=m-1;high=m-1;////

插入低半区

else

low=m+1;low=m+1;////

插入高半区

}

for(int j=i-1;j>=high+1;--j)

L.key[j+1]=.key[j+1]=LL.key[j]; //

记录后移

L.key[high+1]=.key[high+1]=LL.key[0]; //

插入

}

}

//归并排序

template

void Merge(type * *SRSR,type * *TRTR,int i,int

m,int

n)

{//将有序的SR[i...m]

和SR[m+1...n]

归并为有序的TR[i...n]

int j,k;

for(j=(j=mm+1,k=+1,k=ii;i<=<=mm&&j<=&&j<=nn;k++);k++)////

将SR

中的记录由大到小并入TR

{

if(SR[i]<=]<=SRSR[j])

TR[k]=[k]=SRSR[i++];

else

TR[k]=[k]=SRSR[j++];

}

if(i<=<=mm)//

将剩余的SR[i...m]

赋值到TR

for(int a= a=ii;a<=;a<=mm;a++)

TR[k++]=[k++]=SRSR[a];

else

if(j<=(j<=nn)//

将剩余的SR[j...n]

复制到TR

for(int b=j;b<=n;b++)

TR[k++]=[k++]=SRSR[b];

}

template

void MSort(type * *SRSR,type * *TR1TR1,int s,int

t)

{

type TR2[100000];//

数组大小可以根据实际情况重新定义

int m;

//

将SR[s...t]

归并排序为TR[s...t]

if(s====tt)

TR1[s]=]=SRSR[s];

else

{

m=(m=(ss+t)/2;)/2;////

将SR[s...t]

平分为SR[s...m]和SR[m+1...t]

MSort(MSort(SRSR,TR2,,TR2,ss,m);,m);////

递归地将SR[s...m]归并为有序的

TR2[s...m]

MSort(MSort(SRSR,TR2,m+1,,TR2,m+1,tt););////

递归地将SR[m+1...t]归并为

TR2[m+1...t]

Merge(TR2,Merge(TR2,TR1TR1,s,m,,m,tt););////

将TR2[s...m]和TR2[m+1...t]

归并

到TR1[s...t]

}

}

template

void MergeSort(SqList &L)

{//对顺序表L

作归并排序

MSort(MSort(LL.key,.key,LL.key,1,.key,1,LL.length);

}

//快速排序

template

int Partition(SqList& >& LL,int low,int

high)

{//交换顺序表L

中子表key[low]--key[high]

中的记录,枢轴记录到位,并

返回其所在位置,

//此时在它之前(后)的记录均不大(小)于它 type pivotkey;

L.key[0]=.key[0]=LL.key[.key[lowlow];];////

用子表的第一个记录作枢轴记录

pivotkey=pivotkey=LL.key[.key[lowlow];];////

关键字

while(low

从表的两端交替向中间扫描

{

while(low=pivotkey) --high;

L.key[.key[lowlow]=]=LL.key[.key[highhigh];];////

将比枢轴小的记录移至低端

while(low

L.key[.key[highhigh]=]=LL.key[.key[lowlow];];////

将比枢轴大的记录移至高端

}

L.key[.key[lowlow]=]=LL.key[0];.key[0];////

枢轴记录到位

return

low;//

返回枢轴位置

}

template

void QSort(SqList& >& LL,int low,int

high)

{ int mid;//

接收枢轴位置

if(low

{

mid=Partition(mid=Partition(LL,low,high);

QSort(QSort(LL,low,mid-1);,mid-1);////

对低子表进行排序

QSort(QSort(LL,mid+1,,mid+1,highhigh););////对高子表进行排序

}

}

template

void QuitSort(SqList& >& LL)//对顺序表进行快速排序

{

QSort(QSort(LL,1,,1,LL.length);

}

Sort.cpp

void main() {

SqList sl;

LONGLONG start1,finish1,start2,finish2,start3,finish3; CreateSqList(sl);

start1=GetTickCount();

BInsertSort(sl);

finish1=GetTickCount();

delete sl.key;

cout <<"

插入排序平均物理执行时间为

"<

CreateSqList(sl);

start3=GetTickCount();

QuitSort(sl);