A[j]=A[j-1];j--;//A[j-1]元素后移,j指针前移
}
A[j]=temp;//待插入元素存入找到的插入位置
}
}
Mergesort.h
#include
//两路合并的C++程序
template
voidMerge(TA[],inti1,intj1,inti2,intj2)
{//i1,j1是子序列1的下、上界,i1,j2是子序列2的下、上界
T*Temp=newT[j2-i1+1];//分配能存放两个子序列的临时数组
inti=i1,j=i2,k=0;//i,j是两个子序列的游动指针,k是Temp的游动指针
while(i<=j1&&j<=j2)
if(A[i]<=A[j])Temp[k++]=A[i++];
elseTemp[k++]=A[j++];
while(i<=j1)Temp[k++]=A[i++];
while(j<=j2)Temp[k++]=A[j++];
for(i=0;idelete[]Temp;
}
//合并排序的C++程序
template
voidMergeSort(TA[],intn)
{
inti1,j1,i2,j2;//i1,j1是子序列1的下、上界,i2,j2是子序列2的下、上界
intsize=1;//子序列中元素个数,初始化为1。
while(sizei1=0;
while(i1+sizei2=i1+size;
j1=i2-1;
if(i2+size-1>n-1)
j2=n-1;
elsej2=i2+size-1;
Merge(A,i1,j1,i2,j2);
i1=j2+1;
}
size*=2;
}
}
Heapsort.h
#include
//AdjustDown函数
template
voidAdjustDown(TA[],intr,intj)
{
intchild=2*r+1;Ttemp=A[r];
while(child<=j){
if((childif(temp>=A[child])break;
A[(child-1)/2]=A[child];
child=2*child+1;
}
A[(child-1)/2]=temp;
}
//堆排序的C++程序
template
voidHeapSort(TA[],intn)
{
for(inti=(n-2)/2;i>-1;i--)AdjustDown(A,i,n-1);//构造最大堆
for(i=n-1;i>0;i--){
Swap(A[0],A[i]);
AdjustDown(A,0,i-1);
}
}
Meau.h
#include
#include
#include
#include
#include"selectsort.h"
#include"insertsort.h"
#include"bubblesort.h"
#include"quicksort.h"
#include"mergesort.h"
#include"heapsort.h"
#defineSIZE400
#defineTIMES1000
template
classMenu
{
public:
voidprintmenu();
voidselectsort();//简单选择排序
voidinsertSort();//直接插入排序
voidbubbleSort();//冒泡排序
voidquickSort();//快速排序
voidmergeSort();//两路合并排序
voidheapSort();//堆排序
voidchildmenu();//子菜单1
voidchildmenu2();//子菜单2
voidswitcha();
private:
inta,b,c;
};
template
voidMenu:
:
printmenu()
{
cout<<"--------------------------------------------------------"<cout<<"内排序测试系统"<cout<<"--------------------------------------------------------"<cout<<"1.简单选择排序"<cout<<"2.直接插入排序"<cout<<"3.冒泡排序"<cout<<"4.快速排序"<cout<<"5.两路合并排序"<cout<<"6.堆排序"<cout<<"7.退出"<cout<<"PS:
测试用的数组元素为"<this->switcha();
}
template
voidMenu:
:
childmenu()
{
cout<<"--------------------------------------------------------"<cout<<"1.最好情况"<cout<<"2.最坏情况"<cout<<"3.平均情况"<cout<<"4.返回主菜单"<cin>>b;
if(b==4)this->printmenu();
}
template
voidMenu:
:
childmenu2()
{
cout<<"--------------------------------------------------------"<cout<<"1.原始算法"<cout<<"2.改进算法"<cout<<"3.返回主菜单"<cin>>c;
if(c==3)this->printmenu();
}
template
voidMenu:
:
switcha()
{
//cout<<"ok"<cin>>a;
switch(a)
{
case1:
this->selectsort();break;//ok
case2:
this->insertSort();break;//ok
case3:
this->bubbleSort();break;//ok
case4:
this->quickSort();break;//ok
case5:
this->mergeSort();break;//ok
case6:
this->heapSort();break;//ok
case7:
exit
(1);break;
default:
cout<<"error"<printmenu();break;
}
};
template
voidprintout(TA[],intn)//打印数组,测试时用
{
for(inti=0;icout<cout<}
template
T*producedate(intx)//产生顺序,逆序,随机的数组
{
inti;
T*A=newT[SIZE];
switch(x)
{
case1:
for(i=0;ibreak;
case2:
for(i=SIZE;i>0;i--)A[i-1]=SIZE-i;returnA;//逆序
break;
case3:
srand(time(NULL));
for(i=0;ibreak;
default:
cout<<"error"<}
}
template
voidSwap(T&a,T&b)//交换2个元素
{
Ttemp=a;
a=b;
b=temp;
}
template
voidMenu:
:
bubbleSort()
{
cout<<"冒泡排序"<this->childmenu();
T*A;
doubleduration;
clock_tstart,finish;
start=clock();
cout<<"ok"<for(inti=0;i{
A=producedate(b);
BubbleSort(A,SIZE);
delete[]A;
}
finish=clock();
duration=(double)(finish-start)/CLOCKS_PER_SEC;
//printout(A,SIZE);
cout<<"用时:
"<system("pause");
//delete[]A;
this->bubbleSort();
}/*ok*/
template
voidMenu:
:
heapSort()
{
cout<<"堆排序"<cout<<"直接用随机数据测试"<T*A;
doubleduration;
clock_tstart,finish;
start=clock();
cout<<"ok"<for(inti=0;i{
A=producedate(3);
HeapSort(A,SIZE);
delete[]A;
}
finish=clock();
duration=(double)(finish-start)/CLOCKS_PER_SEC;
cout<<"用时:
"<system("pause");
this->printmenu();
}
template
voidMenu:
:
insertSort()
{
cout<<"直接插入排序"<this->childmenu();
T*A;
doubleduration;
//A=producedate(b);
//if(A==NULL){cout<<"error";delete[]A;this->insertSort();}
//printout(A,SIZE);
clock_tstart,finish;
start=clock();
cout<<"ok"<for(inti=0;i{
A=producedate(b);
InsertSort(A,SIZE);
delete[]A;
}
finish=clock();
duration=(double)(finish-start)/CLOCKS_PER_SEC;
//printout(A,SIZE);
cout<<"用时:
"<system("pause");
//delete[]A;
this->insertSort();
}
template
voidMenu:
:
mergeSort()
{
//this->childmenu();
cout<<"合并排序"<cout<<"直接用随机数据测试"<T*A;
doubleduration;
clock_tstart,finish;
start=clock();
cout<<"ok"<for(inti=0;i{
A=producedate(3);
MergeSort(A,SIZE);
delete[]A;
}
finish=clock();
duration=(double)(finish-start)/CLOCKS_PER_SEC;
//printout(A,SIZE);
cout<<"用时:
"<system("pause");
//delete[]A;
this->printmenu();
}/*ok*/
template
voidMenu:
:
quickSort()
{
this->childmenu2();
T*A;
doubleduration;
clock_tstart,finish;
if(c==1)
{
cout<<"原始快速排序"<cout<<"直接用随机数据测试"<start=clock();
cout<<"ok"<for(inti=0;i{
A=producedate(3);
QuickSort2(A,SIZE);
delete[]A;
}
finish=clock();
duration=(double)(finish-start)/CLOCKS_PER_SEC;
cout<<"用时:
"<system("pause");this->quickSort();
}
elseif(c==2)
{
cout<<"改进的快速排序"<cout<<"直接用随机数据测试"</*A=producedate(3);
printout(A,SIZE);
quick(A,SIZE);
printout(A,SIZE);
delete[]A;
this->printmenu();
*/
//T*A;
start=clock();
cout<<"ok"<for(inti=0;i{
A=producedate(3);
quick(A,SIZE);
delete[]A;
}
finish=clock();
duration=(double)(finish-start)/CLOCKS_PER_SEC;
cout<<"用时:
"<system("pause");
this->quickSort();
}
else{cout<<"error"<printmenu();}
}
template
voidMenu:
:
selectsort()
{
//this->childmenu();
cout<<"简单选择排序"<cout<<"直接用随机数据测试"<T*A;
doubleduration;
clock_tstart,finish;
start=clock();
cout<<"ok"<for(inti=0;i{
A=producedate(3);
SelectSort(A,SIZE);
delete[]A;
}
finish=clock();
duration=(double)(finish-start)/CLOCKS_PER_SEC;
//printout(A,SIZE);
cout<<"用时:
"<system("pause");
//delete[]A;
this->printmenu();
}
/*ok!
*/
Mymain.cpp
#include"Menu.h"
intmain()
{
MenuMenuObj;
MenuObj.printmenu();