成绩排序习题

题目描述查找和排序题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。示例:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
jack 70
Tom 70
peter 96

输入描述:
输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开
输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
示例:(输入如下)
3
0
fang 90
yang 50
ning 70
输出为:
fang 90
ning 70
yang 50

在这采用直接插入排序,当然别的排序方法也是可以的,但必须是稳定的。

#include<iostream>
typedef struct{
    char* a;
    int b;
              }type;
int main()
{
 using namespace std;
 int index1, index2;
    while(cin >> index1 >> index2)//为方便测试多个用例
    {
     type* ele = new type[index1];
     int i;
     for (i = 0; i < index1; i++)
     {
      ele[i].a = new char[30];
      cin >> ele[i].a >> ele[i].b;
     }
 //输入完所有数据保存在ele结构体数组当中。
     type temp;
     int j;
     temp.a = new char[30];
     if (index2 == 1)//直接插入排序(升序)
        {
            for (i = 1; i < index1; i++)
            {
          	if (ele[i].b < ele[i - 1].b)
         	   {
            	     temp.a = ele[i].a;
            	     temp.b = ele[i].b;
          	     for (j = i - 1; temp.b < ele[j].b&&j >= 0; j--)
          		  {
           	    	   ele[j + 1].a = ele[j].a;
            	  	   ele[j + 1].b = ele[j].b;
          		  }
          	     ele[j + 1].a = temp.a;
              	     ele[j + 1].b = temp.b;
         	   }
             }
            for (i = 0; i < index1; i++)
                 cout << ele[i].a << ' ' << ele[i].b << endl;
        }
        
    else//直接插入排序(降序)
        {
            for (i = 1; i < index1; i++)
            {
         	 if (ele[i].b > ele[i - 1].b)
          	  {
            	     temp.a = ele[i].a;
             	     temp.b = ele[i].b;
           	     for (j = i - 1; temp.b > ele[j].b&&j >= 0; j--)
           	     {
            	        ele[j + 1].a = ele[j].a;
             	        ele[j + 1].b = ele[j].b;
            	     }
           	     ele[j + 1].a = temp.a;
           	     ele[j + 1].b = temp.b;
         	  }
            }
            for (i = 0; i < index1; i++)
                cout << ele[i].a << ' ' << ele[i].b << endl;
        }
    delete[]ele;
   }
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值