回 帖 发 新 帖 刷新版面

主题:[讨论]为什么测试数据不能大于1000

这是别人编的程序。。。。
是产生随机数,然后比较各种排序算法的时间。。。
要求是产生30000可是。。这个不能超过1000 
修改 MAXSIZE 的值大于1000 运行时就会出错
望大虾指点一下


#include <iostream.h>
#include <malloc.h>
#include <stdlib.h>
#define LS(a,b) ((a)<(b))
#define LL(a,b) ((a)>(b))
#define MAXSIZE 1000
typedef int KeyType;
typedef struct 
{
    int key;
}RedType;
typedef struct
{
    RedType r[MAXSIZE+1];
    int length;
}SqList;
typedef SqList HeapType;
int compare=0;
int change=0;
int Create_Sq(SqList &L)
{
    int i,k;
    cout<<"请输入产生随机数的个数:";
    cin>>k;
    L.length=k;
    for(i=1;i<=k;++i)
    {
        
        L.r[i].key=rand();
    }
    return 1;
}
void Bubble_sort(SqList &L)
{//冒泡排序
    int i,j,l,k=L.length;
    for(i=1;i<=L.length-1;++i)
    {
          for(j=1;j<=k-1;++j)
          {
               ++compare;
               if(LL(L.r[j].key,L.r[j+1].key))
               {
                    l=L.r[j].key;
                    L.r[j].key=L.r[j+1].key;
                    L.r[j+1].key=l;
                    ++change;
                }
          }
          --k;
    }
    cout<<endl<<"-----冒泡排序后的序列-----"<<endl;
    for(i=1;i<=L.length;i++)
      cout<<" "<<L.r[i].key;
    cout<<endl;
    cout<<"冒泡排序的比较次数:";
    cout<<compare<<endl;
    cout<<"冒泡排序的交换次数:";
    cout<<change<<endl;
        compare=0;
    change=0; 

void InsertSort(SqList &L)
{//直接插入排序
    int i,j;
    cout<<endl;
    for(i=2;i<=L.length;++i)
      if(LS(L.r[i].key,L.r[i-1].key))
      {
           ++compare;
           ++change;
           L.r[0]=L.r[i];
           L.r[i]=L.r[i-1];
           for(j=i-2;LS(L.r[0].key,L.r[j].key);--j)
           {
                ++compare;
                L.r[j+1]=L.r[j];
           }
           L.r[j+1]=L.r[0];
      }
    cout<<"-----直接插入排序后的序列-----"<<endl;
    for(i=1;i<=L.length;i++)
      cout<<" "<<L.r[i].key;
    cout<<endl;
    cout<<"直接插入排序的比较次数:";
    cout<<compare<<endl;
    cout<<"直接插入排序的交换次数:";
    cout<<change<<endl;
    compare=0;
    change=0; 

void SelectSort(SqList &L)
{//简单选择排序
    int l,i,j;
    cout<<endl;
    for(i=1;i<L.length;++i)
    {
          L.r[0]=L.r[i];
          j=i+1;
          l=i;
          for(j;j<=L.length;++j)
          {
               ++compare;
               if(LL(L.r[0].key,L.r[j].key))
               {
                    l=j;
                    L.r[0]=L.r[j];
               }
          }
           if(l!=i)
          {
                ++change;
                L.r[l]=L.r[i];
                L.r[i]=L.r[0];
          }
    }



回复列表 (共2个回复)

沙发


cout<<"-----简单选择排序后的序列-----"<<endl;
    for(i=1;i<=L.length;i++)
    cout<<" "<<L.r[i].key;
    cout<<endl;
    cout<<"简单选择排序的比较次数:";
    cout<<compare<<endl;
    cout<<"简单选择排序的交换次数:";
    cout<<change<<endl;
    compare=0;
    change=0; 

int Partition(SqList &L,int low,int high)
{
    int pivotkey;
    L.r[0]=L.r[low];
    pivotkey=L.r[low].key;
    while(low<high)
    {
          while(low<high&&L.r[high].key>=pivotkey)
          {
               ++compare;
               --high;
          }
          ++change;
          L.r[low]=L.r[high];
          while(low<high&&L.r[low].key<=pivotkey)
          {
               ++compare;
               ++low;
          }
          ++change;
          L.r[high]=L.r[low];
    }
    L.r[low]=L.r[0];
    return low;

void QSort(SqList &L,int low,int high)
{//递归形式的快速排序算法
    int pivotloc;
    if(low<high)
    {
          pivotloc=Partition(L,low,high);
          QSort(L,low,pivotloc-1);
          QSort(L,pivotloc+1,high);
    }

void QuickSort(SqList &L)
{
    int i;
    QSort(L,1,L.length);
    cout<<"-----快速排序后的序列为-----"<<endl;
    for(i=1;i<=L.length;i++)
    cout<<" "<<L.r[i].key;
    cout<<endl;
    cout<<"快速排序的比较次数:";
    cout<<compare<<endl;
    cout<<"快速排序的交换次数:";
    cout<<change<<endl;
    compare=0;
    change=0;

void ShellInsert(SqList &L,int dk)
{//希尔排序
    int i;
    int j;
    for(i=dk+1;i<=L.length;++i)
      if(LS(L.r[i].key,L.r[i-dk].key))
      {
           ++compare;
           L.r[0]=L.r[i];
          for(j=i-dk;j>0&&LS(L.r[0].key,L.r[j].key);j-=dk)
          {
               ++compare;
               ++change;
               L.r[j+dk]=L.r[j];
          }
          L.r[j+dk]=L.r[0];
      }

void ShellSort(SqList &L,int dlta[])
{//希尔排序
    int k,j=L.length/2,t=0;
    while(j>=0)
    {
          ++t;
          j-=2;
    }
    j=L.length/2;
    for(k=0;k<t;++k)
    {//计算每次的增量值
          if(j==0) 
           j=1;//定义最后一趟排序的增量
          dlta[k]=j;
          j-=2;
    }
    for(k=0;k<t;++k)
      ShellInsert(L,dlta[k]);
    cout<<"-----希尔排序后的序列为-----"<<endl;
    for(k=1;k<=L.length;k++)
      cout<<" "<<L.r[k].key;
    cout<<endl;
    cout<<"希尔排序的比较次数:";
    cout<<compare<<endl;
    cout<<"希尔排序的交换次数:";
    cout<<change<<endl;
    compare=0;
    change=0; 
}
void HeapAdjust(HeapType &H,int s,int m)
{//堆排序
    int j;
    RedType rc;
    rc=H.r[s];
    for(j=2*s;j<=m;j*=2)
    {
        if(j<m&&LS(H.r[j].key,H.r[j+1].key))
        {
            ++compare;
            ++j;
        }
        if(!LS(rc.key,H.r[j].key))
        {
            ++compare;
            break;
        }
        H.r[s]=H.r[j];
        s=j;
    }
    H.r[s]=rc;

void HeapSort(HeapType &H)
{
    int i;
    for(i=H.length/2;i>0;--i)
        HeapAdjust(H,i,H.length);
    for(i=H.length;i>1;--i)
    {
        ++change;
        H.r[0]=H.r[1];
        H.r[1]=H.r[i];
        H.r[i]=H.r[0];
        HeapAdjust(H,1,i-1);
    }
    cout<<"-----堆排序后的序列为-----"<<endl;
    for(i=1;i<=H.length;i++)
        cout<<" "<<H.r[i].key;
    cout<<endl;
    cout<<"堆排序的比较次数:";
    cout<<compare<<endl;
    cout<<"堆排序的交换次数:";
    cout<<change<<endl;
    compare=0;
    change=0; 
}  

void main()
{
    int i;
    int dlta[MAXSIZE];
    SqList L;
    Create_Sq(L);

    cout<<"-----待排序序列为-----"<<endl;
    for(i=1;i<=L.length;i++)
    cout<<" "<<L.r[i].key;
    
    
        
//冒泡排v序
    SqList L1=L; 
    Bubble_sort(L1);
//直接插入排序
    SqList L2=L;
    InsertSort(L2);
//简单选择排序
    SqList L3=L;
    SelectSort(L3);
//快速排序
    SqList L4=L;
    QuickSort(L4);
//希尔排序
    SqList L5=L;
    ShellSort(L5,dlta);
//堆排序
    SqList L6=L;
    HeapSort(L6);
}

板凳

1.用法不当,没有听说一个类型的size查过几十K的,SqList显然太大了,建议采用动态分配的方式.

  2.在link程序时,编译器会设定栈的空间,尽管可以设定编译时的栈空间,但栈的空间总是有限的,因此在局部变量中定义太大的结构体会导致栈溢出,在你的代码中在main函数中,定义了6个超级大的局部变量(L1,L2,L3,L4,L5,L6),不溢出才怪呢,切记局部变量总是保存在栈中.解决方法,将这个变量的定义移出main函数,改为全局变量,应该可以解决问题.

 3.一般不为人知的设置: 在VC6.0 中改变默认的栈空间的设置方法:
   1.点击 project -> settings 菜单
   2.激活 link 选项页,category 选择category.
   3.stack allocations下面的编辑框设定栈的空间 

我来回复

您尚未登录,请登录后再回复。点此登录或注册