查找排序应用问题实现

#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 20
int n;
typedef struct //学生结构体的定义
{
    int num;//学号  
    char name[10];//姓名
    char cla[20];//班级  
    int age;//年龄
}Student;  
typedef struct SqList//顺序表结构体的定义  
{   
    Student Stu[MAXSIZE+1];//定义一个存放学生信息的数组
}SqList;
void CreatInfo(SqList &L)  
{
    cout<<"请输入你要创建的学生数:"<<endl;
    cin>>n;     
    cout<<"学生的信息:"<<endl;      
    cout<<"姓名 学号 年龄 班级:"<<endl;
    for(int i=1;i<=n;i++)
    {  
        cin>>L.Stu[i].name>>L.Stu[i].num>>L.Stu[i].age>>L.Stu[i].cla;
    }
}  
void print(SqList &L)//输出顺序表
 {
    cout<<"输出学生信息:"<<endl;  
    for(int i=1;i<=n;++i)
    {
        cout<<L.Stu[i].name<<" "<<L.Stu[i].num<<" "<<L.Stu[i].age<<"  "<<L.Stu[i].cla<<endl;
    }
}  
void Insertsort(SqList &L)//直接插入排序(班级优先)
 {
    int i,j;
    for(i=2;i<=n;++i)  
        if(strcmp(L.Stu[i].cla,L.Stu[i-1].cla)<0)  
        {     
            L.Stu[0]=L.Stu[i];
            for(j=i-1;strcmp(L.Stu[0].cla,L.Stu[j].cla)<0;--j)  
                L.Stu[j+1]=L.Stu[j];   
            L.Stu[j+1]=L.Stu[0];
        }
}  
int Partition(SqList &L,int i,int j)//快速排序
 {    
    Student p;
    L.Stu[0]=L.Stu[i];
    p=L.Stu[i];    
    while(i<j)  
    {  
        while(i<j &&L.Stu[j].num>=p.num)   
            j--;  
        L.Stu[i]=L.Stu[j];   
        while(i<j &&L.Stu[i].num<=p.num)   
            i++;      
        L.Stu[j]=L.Stu[i];  
    }     
    L.Stu[i]=p;   
    return i;  
}
void Quicksort(SqList L,int low,int high)//快速排序
{     
    int location;     
    if(low<high)
    {   
        location=Partition(L,low,high);    
        Quicksort(L,low,location-1);   //对左区间递归排序
        Quicksort(L,location+1,high);      //对右区间递归排序   
    }
}
void Selectsort(SqList &L)//选择排序(姓名优先)
{
    Student t;   
    int i,j,k;     
    for(i=1;i<=n;i++)
    {  
        k=i;  
        for(j=i+1;j<=n;j++)     
            if(strcmp(L.Stu[j].name,L.Stu[k].name)<0)
                k=j;          
            if(k!=i)
            {   
                t=L.Stu[i];  
                L.Stu[i]=L.Stu[k];
                L.Stu[k]=t;
            }
    }
}  
void find(SqList &L,int n)//查找学生信息
{
    int t,m=1;  
    cout<<"请输入你要查找的学号:"<<endl;
    cin>>t;  
    cout<<"该学生的信息为:"<<endl;  
    while(m<=n&&L.Stu[m].num!=t)
        m++;       
    if(L.Stu[m].num==t)   
        cout<<"学号是:"<<L.Stu[m].num<<"\t姓名:"<<L.Stu[m].name<<"\t班 级:"<<L.Stu[m].cla<<"\t年龄:"<<L.Stu[m].age<<endl;
    else
        cout<<"没有你要查找的学生!"<<endl;
 }  
int main()
{
    SqList L;
    int k;  
    CreatInfo(L);//创建学生信息  
    print(L);//按输入顺序打印出顺序表
 loop:   cout<<"请选择排序方式:"<<endl;  
         cout<<"1 插入排序(班级优先)"<<endl;
         cout<<"2 选择排序(姓名优先)"<<endl;
         cout<<"3 快速排序"<<endl;
         cout<<"4 按学号查找学生"<<endl;
         cout<<"0 退出排序程序"<<endl;  
             cin>>k;  
         if(k!=0)   
         {
             switch(k)
             {
             case 1:Insertsort(L);//进行插入排序   
                 print(L);break; //输出插入排序后的顺序表    
             case 2:Selectsort(L);//进行选择排序   
                 print(L);break;//输出排序后的顺序表   
             case 3:Quicksort(L,1,n);//选择快速排序  
                 print(L);break;//输出排序后的顺序表  
             case 4:find(L,n);break;//查找学生信息  
             default:cout<<"输入错误!"<<endl;  
             }
         }   
         cout<<endl;
         goto loop;
         return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值