⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ++

📁 数据结构课程设计:冒泡排序算法的具体实现
💻
字号:
#define MAXSIZE 1000   //可排序表的最大长度
#define SORTNUM 2      //测试两种排序方法
typedef void (*Func)(long c,longs);   //2种排序方法的函数类型Func
static Func Sorts[SORTNUM]={BubbleSort,QuickSort};   //便于依次测试2种排序算法
static char *SortNames[SORTNUM]={"Bubbl","Quick"};   //用于显示测试结果比较表
static int Mix[]={0,1,4,16,64,128,256,512,4096};     //构造各级乱序表时随机交换元素个数
typedef int DataType[MAXSIZE+2];      //data[-1]和data[MAXSIZE+1]为辅助单元
DataType data;     //可排序表的顺序存储空间
DataType data2;    //辅助空间,保留最新打乱的数据
int      size;     //表的当前长度
long  compCount;   //关键字比较技数
long  shiftCount;  //关键字移动技数
//------------内部操作-------------
void BeforeSort()     //每个排序算法在入口处调用
{
 compCount=shiftCount=0;
} //BeforeSort                                                                                                                                                                                                                                         

status Less (int i,int j)    //若表中第i个元素小于第j个元素,则返回True,否则False
{
 compCount++;                //关键字比较次数加1
 return data[i]<data[j];
}  //Less

void Swap (int i,int j)      //交换表中第i个和第j个数据元素
{
 data[i]<-->data[j];
   shiftCount=shiftCount+3;  //关键字移动次数加3
}  //Swap

void Shift (int i,int j)     //将表中第i个元素的值赋给第j个元素
{
 data[j]=data[i];
   shiftCount++;             //关键字移动次数加1    
}   //Shift

void  CopyData (DataType list1,DataType &list2)      //复制数据
{
 for (i=1;i<=size;i++)   list2[[i]=list1[i];
}  //CopyData

void InverseOrder()          //将可排序表置为逆序
{
 for (i=1;i<=size;i++) data[i]=data2[i]=size-i+1;
}  //InverseOrder

//------部分操作的伪码算法-------- 
void InitList(int n)
{
 if (n<1) size=0; 
 else{
   if (n>MAXSIZE) n=MAXSIZE;
   for (i=1;i<=n;i++) data[i]=data2[i]=i;
   size=n;
  }
  compCount=shiftCount=0;
}  //InitList

void RandomizeList(int d,int isInverse)   //对可排序表进行d次随机打乱.d>=0&&d<=8,d为0时表不变
{
 if(isInverse)InverseOrder();            //逆序
 else InitList(size);                    //正序
 for(i=1;i<=Mix[d];i++)                  //d级打乱,随机交换若干元素
   data[Random(size)+1]<-->data[Random(size)+1];
 CopyData(data,data2);                   //保留,以便对各种排序算法测试相同数据
}  //RandomizeList

void RecallList()             //恢复最后一次用RandomizeList随机打乱后的可排序表
{
 CopyData(data2,data);
}  //RecallList

void BubbleSort (listtype r,long &c,long&s)   //进行冒泡排序,返回关键字比较次数c和移动次数s
 Sorted=FALSE;Pass=0;
 while (!Sorted)
 {Pass++;Sorted=TRUE;
  for(i=1;i<=n-Pass;i++)
    if(r[i].key>r[i+1].key)
    {r[i]<-->r[i+1];
     Sorted=FALSE;
    }
  }
  c=compCount;s=shiftCount;
}

void QuickSort(listtype r,int c,s)
{
 if(c<s)
 {QuickSort(r,c,s,&k);
  QuickSort(r,c,k-1);
  QuickSort(r,k+1,s);
 }
}
void QuickSort(listtype r,int c,s,*i)
{
 c=compCount;s=shiftCount;
 *i=c;j=s;rp=r[c];x=r[c].key;
 while(i<j)
 {while((*i<j)&&(r[j].key>=x))
   j--;
   r[*i]=r[j];
   while((*i<j)&&(r[i].key<=x))
   (*i)++;
   r[j]=r[*i];
  }
  r[i]=rp;
}



#define minGroup 8
#define maxGroup 18
void Initialization(){//系统初始化
  randomize();
  clscr();//清屏

在屏幕上方显示操作命令清单和缺省值:
    SortTest-1  Size(100-1000)--2 Groups(8-18)--3 Quit--q
      size=400  groups=18
 }//Initialization

void ReadCommand(char &cmd){//读入操作命令符
显示键入操作命令符的提示信息;
do{cmd=getche();} while(cmd不属于['1','2','3','q','Q']);
}
void Interpret(char cmd){//解释执行操作命令cmd
  switch(cmd){
case'1':显示测试结果比较表的表头;//以下略去表格符号显示
        for(i=0;i<=groups-1;i++){//逐组测试
          if(i<groups/2)
             RandomizeList(i,FALSE);//对正序表作第i级打乱
          else 
             RandomizeList(groups-i-1,TRUE);//对逆序表作第i级打乱
          for(j=0;j<SORTNUM;j++){//对每种排序方法测试
            RecallList();//还原数据
            (*Sorts[j])(c,s);//测试第j种排序算法
//显示关键字比较次数c和移动次数s:
   GotoXY(6+(j-1)*6,i+7);printf("%6ld",c);
   GotoXY(44+(j-1)*6,i+7);printf("%6ld",s);
  }//forj
}//fori
显示测试结果比较表的相应部分表格符;
break;
case'2':显示键入可排序的长度的提示信息;
       scanf("%d",n);//读入表的长度到整数变量n
       if(n<100) n=100;
       if(n>1000)n=1000;
       InitList(n);//构造元素依次为1,2,3......n的有序表
       break;
case'3':显示键入测试的组数的提示信息;
       scanf("%d",groups);
       if(groups<minGroup) groups=minGroup;  
       if(groups>maxGroup) groups=maxGroup; 
      }
}//Interpret


void main(){//主函数
Initialization();   //初始化
 do{
    ReadCommand(cmd);   // 读入一个操作命令符

    Interpret(cmd);    //解释执行命令符
  }while (cmd!='q'&&cmd!='Q');
}//main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -