关于若干种排序算法的测试

类别:编程语言 点击:0 评论:0 推荐:

#include  <iostream>
#include  <time.h>
#include  <conio.h>
using namespace std;


class Sort
{
private:
 int *base;
 int *arr;
 int length;
 int data_type;
 bool is_display;
    void HeapAdjust(int , int) ;          //堆调整
 void Partition(int , int);           //快速排序的数组分割
public:

 Sort(int size, int kind,char display);     //分配数组内存
 ~Sort();                       //释放分配的内存
 void Show();               //显示数组的值
 bool Copy();                                //内存拷贝
 void Display();                             //最后输出显示
 void RunTime(int runtime){cout<<"花费时间"<<(long double) runtime/CLOCKS_PER_SEC<<endl;}  //计算排序算法运行时间
  void BubbleSort();                  //冒泡排序
  void QuickSort();      //快速排序
  void  HeapSort();                  //堆排序
  void  SelectionSort();            //选择排序
  void  InsertSort();              //插入排序
  void  ShellSort();              //希尔排序
  void  RadixSort();             //基数排序
 
};

Sort::Sort(int size = 100,int kind = 0,char display = 'N')
{
 int i;
 length = size;
 data_type = kind;
 if(display == 'Y' || display == 'y')
  is_display = true;
 else
  is_display = false;

  //基于base数组分配内存并赋随机值
 base = (int*)malloc(sizeof(int)*size);
 if(!base)                     
 {
  cerr<<"The system malloc memory error!"<<endl;
     exit(1);
 }
 switch(kind)           //base数组赋值类型选择(0--随机值    1--正序      2--逆序)
 {
 case 0:
  i = clock();
  srand(i);
  for(i = 0;i<size;i++)
   base[i] =::rand();
  break;
 case 1:
  for(i = 0;i<size;i++)
   base[i] = i;
  break;
 case 2:
  for(i = 0;i < size;i++)
   base[i] = (size - i);
  break;
 default:
  break;
 }
 
 //基于arr数组分配内存并赋0值
 arr = (int*)malloc(sizeof(int)*length);    
 if(!arr)
 {
  cerr<<"The system malloc memory error!"<<endl;
  exit(1);
 }
memset(arr,0,sizeof(arr));
}


Sort::~Sort()
{
 free(base);
 free(arr);
}

/*    显示arr数组值   */
void Sort::Show()
{
 int i;
 if(is_display)
 {
  system("PAUSE");
    for(i = 0;i < length;i++)
  cout<<arr[i]<<'\t';
         cout<<endl<<endl<<endl;
 }
 

}

/* 数组拷贝    */
bool Sort::Copy()
{
 int i;

 for(i = 0;i<length;i++)
  arr[i] = base[i];
 return true;
}

/*  冒泡排序    */
void Sort::BubbleSort()
{
 int i,j,t;
 for(i = 0;i<length;i++)
  for(j = i;j<length;j++)
   if(arr[i]>arr[j])
   { t = arr[i]; arr[i] = arr[j]; arr[j] = t; }
 
}
 
/*   快速排序   */

void Sort::Partition(int low,int high)
{
 int i,j,t;
 
 if(low<high)
 {
  i = low ; j = high;
  t = arr[low];
 while(i<j)
 {
  while(i<j&&arr[j]>t) j-- ;
  if(i<j)
   arr[i++] = arr[j];
  while(i<j&&arr[i]<=t) i++ ;
  if(i<j)
   arr[j--] = arr[i];
 }
 arr[i] = t;
 Sort::Partition(low,i-1);
 Sort::Partition(i+1,high);
 }
}
void Sort::QuickSort()
{
 Sort::Partition(0,length -1 );
 
}


/*   堆排序            */

void  Sort::HeapAdjust(int k, int n)
{
int i,j;
 int tmp;
 i=k;
 j=2*i+1;
 tmp=arr[i];
 while(j<n)
 {
  if((j<n-1)&&(arr[j]<arr[j+1]))
   j++;
  if(tmp<arr[j])
  {
   arr[i]=arr[j];
   i=j;
   j=2*i+1;
  }
  else
   break;
 }
 arr[i]=tmp;
}

void  Sort::HeapSort()
{
  int k, des;
 long tmp;
     int n = length;

 for(k=n/2-1;k>=0;k--)  /*建堆*/
  Sort::HeapAdjust(k, n);

 for(des=n-1;des>0;des--) /*排序*/
 {
  tmp=arr[0];
  arr[0]=arr[des];
  arr[des]=tmp;
  Sort::HeapAdjust(0,des);
 }
}

/* 选择排序     */

void  Sort::SelectionSort()
{
 int i,j,t,mins = 0;
 for(i = 0;i < length;i++)
 {
  int mins = i;
  for(j = i+1;j<length;j++)
   if(arr[j]<arr[mins]) mins = j;
  t = arr[i]; arr[i] = arr[mins]; arr[mins] = t;
 }
}


/*  插入排序      */
void  Sort::InsertSort()
{
 int i,j,t;
 for(i = length -1; i>0; i--)     //确定arr数组中最小值,并放在arr[0]做哨兵位
  if(arr[i] < arr[i-1])
  {t = arr[i]; arr[i] = arr[i-1]; arr[i-1] = t;}
 for(i = 2; i<length; i++)
 {
  int j = i; t = arr[i];
  while(t<arr[j-1])
  {
   arr[j] = arr[j-1]; j--;
  }
  arr[j] = t;
 }
}

/*  希尔排序      */
void Sort::ShellSort()
{
 int i,j,h,v;
 for(h = 1; h <= length / 9; h = 3*h+1);     //查找确定最大增量值
 for(; h>0;h /= 3)
  for(i = h; i < length; i++)    //直接插入排序的一种改进(与直接插入排序比较)
  {
   j = i; v = arr[i];
   while(j >= h && v<arr[j-h])
   {
    arr[j] = arr[j-h]; j -= h;
   }
   arr[j] = v;
  }
}

 
/* 基数排序        */
void Sort::RadixSort()
{
 int keysize=5;
 int n = length;
 int i,j,k,t;
 int d,e,m=0;
 int *c[10],z[10];

 for (i=0;i<10;i++)
  c[i]=(int*)malloc(sizeof(int)*n);

 for(i=0;i<keysize;i++)
 {
  memset(z,0,sizeof(z));
  for(j=0;j<n;j++)
  {
   k=arr[j];
   for (t=0;t<i;t++)
    k=k/10;
   k=k%10;
   *(c[k]+z[k])=arr[j];
   z[k]++;
  }

  m=0;
  for(d=0;d<10;d++)
  {
   for(e=0;e<z[d];e++)
   {
    arr[m]=*(c[d]+e);
    m++;
   }
  }
 }

 for (i=0;i<10;i++)
  free(c[i]);
}

void  Sort::Display()
{
 int start_time, end_time;

   
 cout<<"---------快速排序----------"<<endl;
 if(data_type == 0)
 {
 Sort::Copy();
 start_time = clock();
 Sort::QuickSort();
 end_time = clock();
 Sort::RunTime(end_time - start_time);
 Sort::Show();
 }
 else
  cerr<<"正反序情况时,快速排序可能会导致堆栈溢出,故屏蔽测试"<<endl<<endl;

 cout<<"---------堆排序------------"<<endl;
 Sort::Copy();
 start_time = clock();
 Sort::HeapSort();
 end_time = clock();
 Sort::RunTime(end_time - start_time);
 Sort::Show();

  
 cout<<"---------希尔排序----------"<<endl;
 Sort::Copy();
 start_time = clock();
 Sort::ShellSort();
 end_time = clock();
 Sort::RunTime(end_time - start_time);
 Sort::Show();


 cout<<"---------基数排序----------"<<endl;
 Sort::Copy();
 start_time = clock();
 Sort::RadixSort();
 end_time = clock();
 Sort::RunTime(end_time - start_time);
 Sort::Show();

 cout<<"---------插入排序----------"<<endl;
 Sort::Copy();
 start_time = clock();
 Sort::InsertSort();
 end_time = clock();
 Sort::RunTime(end_time - start_time);
 Sort::Show();


 cout<<"----------选择排序-----------"<<endl;
 Sort::Copy();
 start_time = clock();
 Sort::SelectionSort();
 end_time = clock();
 Sort::RunTime(end_time - start_time);
 Sort::Show();


 cout<<"-----------冒泡排序---------"<<endl;
 Sort::Copy();
 start_time = clock();
 Sort::BubbleSort();
 end_time = clock();
 Sort::RunTime(end_time - start_time);
 Sort::Show();


}

 

void main()

 int size,kind;
 bool ct;
 char sz = 'N',ch;
 do{
 cout<<" 输入测试的试验数据个数: (N>0) "<<endl;
 do{
 cin>> size;
 }while(size<1&&(cout<<"数据个数应该大于1,请重新输入:"<<endl));

 cout<<" 输入测试类型值 : (0--随机数   1--正序  2--逆序) "<<endl;
 do{
 cin>>kind;
 }while(((kind>2)||(kind<0))&&(cout<<"类型值范围(0-2),请重新输入:"<<endl));

 if(size<50000)
 {
 cout<<" 是否显示排序结果(Y/N):"<<endl;
 do{
  cin>>sz;
 } while((sz!= 'Y' && sz!= 'N' && sz != 'y' && sz!= 'n')&&(cout<<"请输入(Y or N):"<<endl));
 }
 else
  cout<<"输出测试值太多( >50000 ),没有必要显示"<<endl<<endl<<endl;;
 Sort t(size,kind,sz);
 t.Display();
 cout<<endl<<"是否继续?(Y/N)"<<endl;
 do{
  cin>>ch;
 } while((ch!= 'Y' && ch!= 'N' && ch != 'y' && ch!= 'n')&&(cout<<"请输入(Y or N):"<<endl));
 if(ch == 'Y' || ch == 'y')
  ct = true;
 else
  ct = false;
}while(ct == true);
system("PAUSE");
}

本文地址:http://com.8s8s.com/it/it25392.htm