牛客网 成绩排序

排序算法实战

题目描述

查找和排序

题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
      都按先录入排列在前的规则处理。

   例示:
   jack      70
   peter     96
   Tom       70
   smith     67

   从高到低  成绩            
   peter     96    
   jack      70    
   Tom       70    
   smith     67    

   从低到高

   smith     67  

   Tom       70    
   jack      70    
   peter     96      

输入描述:

输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开

输出描述:

按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

示例1

输入

3
0
fang 90
yang 50
ning 70

输出

fang 90
ning 70
yang 50

今天交这个牛客网上的题目,我得好好吐吐槽,这个编译系统咋这么不顺手呢,用c/c++(clang++ 3.9)这个提交上去的代码输出结果跟我用的cold block输出就是不一样,我就很是纳闷,下面贴出两个代码,要是能看出来区别,请给指点迷津!!!


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
struct info{
    string name;
    int score;
};
bool cmp1(info a,info b)
{   //升序
    return a.score<=b.score;
}
bool cmp2(info a,info b)
{   //降序
    return a.score>=b.score;
}
int main()
{
    int n,flag;
    info p[1005];
    while (cin>>n)
    {
        cin>>flag;
    for (int i=0;i<n;i++)
        cin>>p[i].name>>p[i].score;
    if (flag==1)
        sort(p,p+n,cmp1);
    else
        sort(p,p+n,cmp2);
    for (int i=0;i<=n;i++)
        cout<<p[i].name<<" "<<p[i].score<<endl;
    }
    return 0;
}

下面是别人提交通过的代码,最让我无语的是它提示我输出的个数不对

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
struct student{
  string name;
    int score;
};
bool cmp0(const student &a, const student &b){
    // 从高到低排序
    return a.score > b.score;
}
bool cmp1(const student &a, const student &b){
    // 从低到高排序
    return a.score < b.score;
}
int main(){
    int N, type;
    while(cin >> N >> type){
        vector<student> stud(N);
          
        for(int i = 0; i < N; i ++){
            cin >> stud[i].name >> stud[i].score;
        }
        if(type == 0)
            stable_sort(stud.begin(), stud.end(), cmp0);
        else
            stable_sort(stud.begin(), stud.end(), cmp1);
          
        for(int i = 0; i < N; i ++){
            cout << stud[i].name << " " << stud[i].score << endl;
        }
    }
      
    return 0;
}

<think>好的,我现在需要回答用户关于Python中桶排序算法的实现方法和相关练习题的问题。首先,我得回顾一下桶排序的基本原理和实现步骤。桶排序是一种分布式排序算法,它将元素分到不同的桶中,每个桶再分别排序,最后合并所有桶的结果。 根据用户提供的引用[2],里面有一个桶排序的Python实现例子。我需要仔细分析这段代码,确保理解每个步骤。代码的大致流程是:首先确定输入数组的最小值和最大值,计算每个桶的范围,然后创建桶数组,将元素分配到对应的桶中,接着对每个桶内部进行排序,最后将排序后的桶按顺序合并回原数组。这个过程需要注意如何处理桶的范围以及避免空桶的情况。 接下来,我需要按照用户的要求,结构清晰地分步骤解释实现过程。第一步是确定桶的数量和范围,这里用户提供的例子中使用的是数组长度作为桶的数量,这可能适用于某些情况,但桶的数量可以根据实际数据分布调整。第二步是元素分桶,这里使用了一个公式来计算元素应该放入哪个桶。需要注意的是当元素等于最大值时,可能会超出索引范围,所以代码中使用了len(s) + 1个桶,但实际分配时用了int((i-min_num)//bucket_range),这样最大值会被分到最后一个桶。第三步是对每个非空桶进行排序,这里直接调用了Python内置的sorted函数,但实际应用中可能需要根据具体情况选择排序算法。最后是合并所有桶的结果。 然后,用户还希望有相关的编程练习题。根据常见的算法题库,LeetCode、牛客网等平台可能会有相关的题目。例如,用户提到的引用[3]中提到了时间复杂度的问题,桶排序在特定场景下(如数据均匀分布)可以达到线性时间复杂度,所以可以设计或推荐适合桶排序的题目,比如排序浮点数、年龄排序等。 此外,需要考虑桶排序的优化和适用场景。比如,当数据分布不均匀时,桶排序的效率可能会下降,甚至退化为O(n^2)的时间复杂度。因此,在练习题中可能需要处理这种情况,或者设计题目要求处理特定类型的数据。 最后,确保回答符合用户给出的格式要求,包括使用正确的LaTeX格式,生成相关问题,引用标记正确。需要检查引用的内容是否恰当,比如引用[2]中的代码示例是否正确,其他引用是否相关,比如引用[3]提到的时间复杂度问题,可以关联到桶排序的应用场景和优化方法。 总结步骤: 1. 解释桶排序的基本原理。 2. 分步骤详细说明Python实现过程,结合引用[2]的代码。 3. 分析时间复杂度和适用场景,引用其他相关内容如引用[3]的时间复杂度问题。 4. 提供相关的编程练习题,可能参考常见题库或设计适合桶排序的题目。 5. 生成相关问题,如优化方法、复杂度分析等,确保问题与内容相关。 6. 确保所有数学表达式使用正确的格式,如$O(n)$,并检查引用标记的位置。 现在需要将这些思考整理成结构化的回答,符合用户的要求,同时保持自然流畅的中文表达。</think>### Python桶排序算法实现详解 #### 一、算法原理 桶排序(Bucket Sort)通过将数据分到有限数量的**有序桶**中,对每个桶单独排序后合并结果。适用于**数据分布均匀**且取值范围明确的场景,理想时间复杂度为$O(n)$,最坏情况为$O(n^2)$[^2]。 #### 二、实现步骤(含Python代码) 1. **确定桶数量与范围** ```python min_num = min(arr) max_num = max(arr) bucket_range = (max_num - min_num) / len(arr) # 桶间距公式 ``` 2. **元素分桶** ```python buckets = [[] for _ in range(len(arr) + 1)] # 创建n+1个桶 for num in arr: index = int((num - min_num) // bucket_range) buckets[index].append(num) ``` 3. **桶内排序** ```python arr.clear() for bucket in buckets: arr.extend(sorted(bucket)) # 调用内置排序[^2] ``` > 完整代码示例: > ```python > def bucket_sort(arr): > if not arr: return > min_val, max_val = min(arr), max(arr) > bucket_count = len(arr) + 1 > buckets = [[] for _ in range(bucket_count)] > > bucket_size = (max_val - min_val) / bucket_count > for num in arr: > idx = int((num - min_val) // bucket_size) > buckets[idx].append(num) > > arr.clear() > for bucket in buckets: > arr.extend(sorted(bucket)) > ``` #### 三、关键特性 | 特性 | 说明 | |--------------|---------------------------| | 时间复杂度 | 平均$O(n+k)$,k为桶数量[^2] | | 空间复杂度 | $O(n+k)$ | | 稳定性 | 取决于桶内排序算法选择 | | 适用场景 | 均匀分布数据、浮点数排序 | #### 四、典型应用场景 1. 学生成绩排序(0-100分区间) 2. 电商价格区间统计 3. 实验数据分布分析 4. 年龄统计(如人口普查数据) #### 五、编程练习题 1. **LeetCode 164. 最大间距** > 要求:使用线性时间复杂度和空间复杂度求解数组排序后的最大相邻差值[^3] 2. **浮点数排序** > 给定包含100万个[0,1)区间浮点数的数组,实现高效排序 3. **年龄统计系统** > 输入:`[23,45,17,89,5,32,5,23]` > 输出:按年龄分组统计并排序 4. **自定义桶数量优化** > 改造算法使其能根据数据分布自动调整桶数量
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值