// 各种排序算法的实验比较
//计算不同初始状态与排序规模下的各种排序算法的运行时间
#include "time.h"
#include "iostream.h"
#include "stdlib.h"
#include "string.h"
#include "Compare.h"
#include "Node.h"
#include "StraightInsertSorter.h"
#include "ImprovedInsertSorter.h"
#include "BinaryInsertSorter.h"
#include "BubbleSorter.h"
#include "ImprovedBubbleSorter.h"
#include "StraightSelectSorter.h"
#include "ShellSorter.h"
#include "HeapSorter.h"
#include "QuickSorter.h"
#include "ImprovedQuickSorter.h"
#include "TwoWayMergeSorter.h"
#include "ImprovedTwoWayMergeSorter.h"
#include "BucketSorter.h"
#include "RadixSorter.h"
#include "linkRadixSorter.h"
char a[3][10]={"随机","正序","逆序"};
// 设定随即函数的种子
inline void Randomize()
{ srand(1); }
//返回一个0到n-1之间的随机数
inline int Random(int n)
{ return rand() % (n); }
// Timing variables and functions
clock_t tstart = 0; // Time at beginning of timed section
// Initialize the program timer
void Settime()
{ tstart = clock(); }
// Return the elapsed time since the last call to Settime
double Gettime()
{ return (double)((double)clock() - (double)tstart)/
(double)CLOCKS_PER_SEC; }
inline void swap(int * array, int x, int y) //交换位置x和y的元素
{
int temp=array[x];
array[x]=array[y];
array[y]=temp;
}
void main()
{
int numofsort; //输入规模:10, 100 ,1000 ,10000 ,100000 ,1000000
int wayofsort; //排序算法的序号
int flag; //初始数组顺序:正序、逆序、随机顺序,其中正序和逆序分别为已排序及逆排序
while(1)
{
Randomize();
cout<>wayofsort;
if(wayofsort==0) exit(1);
cout<<"请输入数组规模:";
cin>>numofsort;
if(numofsort>1000000)
{
cout<<"sorry,数据规模太大!";
exit(1);
}
cout<<"请输入初始状态(随机0 正序1 逆序2):";
cin>>flag;
int allflag=0;
wayofsort--;
if(wayofsort==19)
{
wayofsort=0;
allflag=1;
}
begin:
wayofsort++;
int *sortarray =new int[1000000];
int *temparray =new int[1000000];
//产生随机数组,长度为1000000
Randomize();
for(int i=0;i<1000000;i++)
sortarray[i]=Random(32003);
//产生正序、逆序数组
if(flag==1||flag==2)
{
//实例化快速排序类
ImprovedQuickSorter sorter;
sorter.Sort(sortarray,0,1000000-1);
if(flag==2)
{
for(int i=0;i<1000000/2;i++)
swap(sortarray,i,999999-i);
}
}
//开始排序
switch(wayofsort)
{
case 1:
{ //直接插入排序
//实例化直接插入排序类
StraightInsertSorter sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.Sort(sortarray+numofsort*i,numofsort);
cout<<"直接插入排序"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.Sort(sortarray+numofsort*i,numofsort);
cout<<"改进的插入排序"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.Sort(sortarray+numofsort*i,numofsort);
cout<<"二分法插入排序"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.Sort(sortarray+numofsort*i,numofsort);
cout<<"起泡排序"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.Sort(sortarray+numofsort*i,numofsort);
cout<<"改进的起泡排序"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.Sort(sortarray+numofsort*i,numofsort);
cout<<"直接选择排序"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.Sort(sortarray+numofsort*i,numofsort);
cout<<"Shell 排序/2"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.delta3Sort(sortarray+numofsort*i,numofsort);
cout<<"Shell 排序/3"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.Sort(sortarray,0+numofsort*i,numofsort-1+numofsort*i);
cout<<"快速排序"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.Sort(sortarray,0+numofsort*i,numofsort-1+numofsort*i);
cout<<"优化的快速排序"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.Sort(sortarray,temparray,0+numofsort*i,numofsort-1+numofsort*i);
cout<<"两路归并排序"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.Sort(sortarray,temparray,0+numofsort*i,numofsort-1+numofsort*i);
cout<<"优化的两路归并排序"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.Sort(sortarray+numofsort*i,numofsort);
cout<<"堆排序"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.Sort(sortarray+numofsort*i,numofsort,16,2);
cout<<"基数排序/2"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
sorter.Sort(sortarray+numofsort*i,numofsort,8,4);
cout<<"基数排序/4"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
{
sorter.Sort(sortarray+numofsort*i,numofsort,5,8);
}
cout<<"基数排序/8"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
{
sorter.Sort(sortarray1+numofsort*i,numofsort,16,2);
}
cout<<"基数排序(队列实现)/2"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
{
sorter.Sort(sortarray1+numofsort*i,numofsort,8,4);
}
cout<<"基数排序(队列实现)/4"< sorter;
Settime();
for(int i=0;i<1000000/numofsort;i++)
{
sorter.Sort(sortarray1+numofsort*i,numofsort,5,8);
}
cout<<"基数排序(队列实现)/8"<