数据结构几种排序

 完整代码

#include<iostream>
#include <stdio.h>
#include<string.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
typedef int Status;
using namespace std;

typedef struct
{char xm[30];     
 int  xh;  
 int CLanguage_P;//C语言程序设计 
 int Discrete_M; //离散数学 
 int sum;        //总分
}ElemType; 
  
typedef struct 
{ ElemType *R; //表基址
 int  length;   //表长
}SSTable;

//1.输入数据创建顺序表
int Insert_SSTable(SSTable &ST,int j) 
{int i;   
 ST.R=new ElemType[MAXSIZE];
 ST.length=0;//空出ST.R[0]的位置
 for(int i=1;i<=j;i++)
 {printf("第%d个学生 ",i);
scanf("%s %d %d %d",ST.R[i].xm,&ST.R[i].xh,
   &ST.R[i].CLanguage_P,&ST.R[i].Discrete_M);
  ST.R[i].sum=ST.R[i].CLanguage_P+ST.R[i].Discrete_M,
  ST.length++;
  }
 return OK;
}
// 2.在表中插入记录
Status ListInsert_SST(SSTable &ST,int i,ElemType st)
{//在顺序表ST的第i个位置之前插入新的数据元素st,
 //i的合法值为,1≤i≤ST.length+1
  int j;
  if(i<1||i>ST.length+1) return ERROR;
  if(ST.length==MAXSIZE-1) return ERROR; 
  //当前存储空间已满
  //下标表示法实现元素移动和插入st 
  for(j=ST.length;j>=i;j--)
    ST.R[j+1]=ST.R[j];//元素后移
  ST.R[i]=st; 
  ST.length++;//表长加1
  return OK;
} 

//3.按学号为关键字直接插入排序
int InsertSort(SSTable &ST) 
 { int i,j;
   for(i=2;i<=ST.length;++i)    
    if( ST.R[i].xh<ST.R[i-1].xh)  
    {ST.R[0]=ST.R[i];     
     ST.R[i]=ST.R[i-1];  
     for(j=i-2; ST.R[0].xh<ST.R[j].xh;--j)
	   ST.R[j+1]=ST.R[j]; 
     ST.R[j+1]=ST.R[0];  
    }
   return OK;
 }

//4.以总成绩为关键字冒泡排序
int BubbleSort(SSTable &ST)
 { int m,i,j,flag=1; 
   ElemType x;
   m=ST.length-1;
   while((m>0)&&(flag==1))
   {  flag=0;
      for(j=1;j<=m;j++)
       if(ST.R[j].sum>ST.R[j+1].sum)
        {flag=1;
         x=ST.R[j];ST.R[j]=ST.R[j+1]; ST.R[j+1]=x; 
        }  //endif
      m--;
    }     //endwhile
   return OK;
 }
  
//5.以C语言成绩为关键字简单选择排序   
int SelectSort(SSTable &ST)
{int i,j,k;
 ElemType t; 
 for(i=1;i<ST.length; ++i)
   {k=i;     
    for(j=i+1;j<=ST.length;j++)
     if(ST.R[j].CLanguage_P<ST.R[k].CLanguage_P) 
	   k=j; 
     if(k!=i)
     {t=ST.R[i];ST.R[i]=ST.R[k];ST.R[k]=t;}  
   }  
 return OK;
}

//6.以离散数学成绩为关键字折半插入排序
int BInsertSort(SSTable &ST)
 {  int i,j,low,high,m;
    for (i=2;i<=ST.length;++i )
    {  ST.R[0]=ST.R[i];low=1;high=i-1 ;
       while(low<=high)  
{ m=(low+high)/2 ; 
          if(ST.R[0].Discrete_M<ST.R[m].Discrete_M) high=m-1;
          else low=m+1; 
        }
       for (j=i-1;j>=high+1;--j) ST.R[j+1]=ST.R[j];
       ST.R[high+1]=ST.R[0];
    }
    return OK; 
  }  // BInsertSort
  
  //7.以姓名为关键字快速排序 
int QKpass( SSTable &ST,int low,int  high ) 
{   ST.R[0] = ST.R[low];   
   while  ( low < high ) 
    { { while(low<high&&strcmp(ST.R[high].xm, ST.R[0].xm)>0 )--high;
                 ST.R[low] =ST.R[high];
      while(low<high&&strcmp(ST.R[high].xm, ST.R[0].xm)<0)++low;
                 ST.R[high]=ST.R[low];
     }

                 ST.R[high] = ST.R[low];
     }
    ST.R[low]=ST.R[0]; 
    return low;
}
void QKSort( SSTable &ST,int low, int high ) 
{  int  pos;
   if  ( low < high ) 
    {   pos= QKpass (ST, low, high ) ;
        QKpass(ST, low, pos-1) ; 
        QKpass(ST, pos+1, high ) ;
    }
}


//8.显示表中数据记录
int show(SSTable &ST)
{int i;
 printf("            姓名   学号   C语言 离散 总分\n");
 for(i=1;i<=ST.length;i++)
  {printf("第%2d名学生:",i);
   printf("%s %d  %d  %d  %d\n",ST.R[i].xm,ST.R[i].xh,
   ST.R[i].CLanguage_P,ST.R[i].Discrete_M,ST.R[i].sum);
 }
 return OK  ;
}    
//主程序代码:                
int main()
{ int i,j,h,choose; 
  ElemType st;
  SSTable ST;
  printf("实验4:排序的基本操作\n"); 
  printf("完成人:\n");printf("完成日期:\n");
   printf("-----------------程序菜单------------------------\n");
   printf("1.输入数据创建顺序表     2.在表中插入记录\n");
   printf("3.按学号直接插入排序     4.按总分冒泡排序\n");
   printf("5.按C成绩简单选择排序   6.按离散成绩折半插入排序\n");
   printf("7.按姓名快速排序         8.输出表中数据记录\n");
   printf(" --------------------0.退出----------------------\n");
   choose = -1;
 while (choose!= 0) {
  printf("请选择:");
  scanf("%d",&choose);
 switch (choose) {
  case 1: //输入数据创建顺序表
   printf("输入学生人数:"); scanf("%d",&j); 
   printf("依次输入  姓名   学号  C语言 离散:\n");  
   Insert_SSTable(ST,j);
   break;
  case 2: //在表中插入数据记录
   printf("输入插入位置i值及姓名 学号  C语言 离散:\n");
   scanf("%d %s %d %d %d",&i,st.xm,&st.xh,
        &st.CLanguage_P,&st.Discrete_M);
   st.sum=st.CLanguage_P+st.Discrete_M;
   printf("完成插入数据记录\n");
   ListInsert_SST(ST,i,st);
   break;
  case 3://按学号直接插入排序(算法8.1) 
   InsertSort(ST);
   printf("完成按学号直接插入排序\n");
   break;
  case 4: //按总分冒泡排序
   BubbleSort(ST);
   printf("完成按总分冒泡排序\n");
   break;
  case 5: //按C语言成绩简单插入选择排序
   SelectSort(ST);
   printf("完成按C语言成绩简单选择排序\n");
   break;
  case 6: //按离散数学成绩折半插入排序
   BInsertSort(ST);
   printf("完成按离散数学成绩折半插入排序\n");
   break; 
  case 7: //按姓名快速快速排序
    QKSort(ST,1,ST.length) ; 
    printf("完成按姓名快速排序\n"); 
   break;
  case 8: //输出顺序表的数据记录 
   show(ST);
   break;
  }
 }
 return 0;
} 

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值