题解 | #输入n个整数,输出其中最小的k个#

输入n个整数,输出其中最小的k个

http://www.nowcoder.com/practice/69ef2267aafd4d52b250a272fd27052c

排序算法总结1

#include <algorithm>
#include <vector>

using namespace std;

vector<int> & mysort(vector<int> & v){
    /*int temp;
    for(int i = 1;i<v.size();i++){
        if(v[i]<v[i-1]){
            temp = v[i];
        
       
        int j;
        for(j=i;v[j-1]>temp&&j>0;j--){
            
            v[j] = v[j-1];
        }
        v[j]=temp;
        }
        
    }直接插入排序*/
    
    /*for(int i =1;i<v.size();i++){
        int temp = v[i];
        int low = 0,high = i-1;
        while(low<=high){
            int m = (low+high)/2;
            if(v[i]>v[m])low=m+1;
            else if(v[i]<v[m]) high = m-1;
            else if(v[i]==v[m]){
                high = m;
                break;
            }
        }//while
            for(int j = i;j>high+1;j--){
                v[j]=v[j-1];
            }
            v[high+1] = temp;
        
    }//for折半插入算法*/
    /*int n =v.size();
    vector<int> vtemp(n,0);
    vtemp[0]=v[0];
    int first=0,last = 0;
    for(int i = 1;i<n;i++){
        
        if(v[i]<vtemp[first]){
            first = (first-1+n)%n;
            vtemp[first] = v[i];
        }
        else if(v[i]>vtemp[last]){
            last = (last+1+n)%n;
            vtemp[last] = v[i];
        }
        else{
            int k = last;
            last = (k+1+n)%n;
            while(vtemp[k]>v[i]){
                vtemp[(k+1+n)%n] = vtemp[k];
                k=(k-1+n)%n;
            }
            k=(k+1+n)%n;
            vtemp[k]=v[i];
        }
        
        
    }//for
    for(int i = 0;i<n;i++){
        v[i] = vtemp[first];
        first = (first+1+n)%n;
    }2路插入*/
    
    
    /*int n = v.size();
    class Node{
        public:
        int key;
        int next;
    };
   Node r[n+1];
    r[0].next = 1;
    r[1].next = 0;
    r[0].key = INT16_MAX;
    for(int i =1;i<n+1;i++){
        r[i].key=v[i-1];
    }
    for(int i = 2;i<n+1;i++){
       int temp = r[0].next;
        int prev = 0;
        while(r[i].key>r[temp].key){
            prev = temp;
            temp=r[temp].next;
        }
        r[prev].next = i;
        r[i].next = temp;
    }
    int p = r[0].next;
    for(int i =1;i<n+1;i++){
        while(p<i)p=r[p].next;
        int temp = r[p].next;
        swap(r[p],r[i]);
        r[i].next = p;
        p = temp;
        
    }
    for(int j = 0;j<n;j++){
        v[j] = r[j+1].key;
    }表插入法的排序*/
    
  
    
    
    
    
    
    
    
    
    
    
    sort(v.begin(),v.end());//STL自带的算法
    return v;
}


int main() {
    int n,k;
    while(cin>>n>>k){
        vector<int> v;
        int temp=0;
        for(int i = 0;i<n;i++){
            cin>>temp;
            v.push_back(temp);
            
        }
        
        v=mysort(v);
        for(int j = 0;j<k;j++){
            cout<<v[j]<<' ';
            
        }
        
    }
}
全部评论

相关推荐

06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务