[算法题答案]有n个长短不一的英文单词(均为小写),它们中最大长度是m,请设计高效的排序算法对其排序

11 篇文章 0 订阅

一、背景

有n个长短不一的英文单词(均为小写),它们中最大长度是m,请设计高效的排序算法对其排序

题目是我编的。

其实是记得群里有人问过“有n个长短不一的英文单词(均为小写),它们中最大长度是m…”,但是题目不完整,我在百度上也没有检索到该题题目,只好自由发挥一下。

如果有朋友有原题目,欢迎在评论区留言。

二、题目分析与代码

英文单词排序,我想到的主要是两种方法:桶排序 (Bucket sort)和通过Ascii码进行其他排序。

题目中的n和m不确定,26个字母的关键字取值范围不小,采用直观的基数排序可能不是那么高效。

总的来说,由于手里题目不完整,这道题缺失了n和m的范围,无法很好的确定排序的方法。

但是通常来讲,我们用桶排序综合来看是比较高效的。

以后这种单纯的算法题就不再写输入语句了吧,

纸面答题主要看mySort,insertSort,comStr这三个函数,答卷的时候尽量清晰一些;

虽然我用了vector这个库,但是我没有用自带的算法甚至没有直接比较字符串,

应该不算犯规吧?

用数组也行,代码量稍微多一点点而已,有需要可以改改~

#include<bits/stdc++.h>
using namespace std;
#define BUCKETS_C 26
vector<string> buckets[BUCKETS_C];

void pirntBck()
{
    for(auto i:buckets)
    {
        for(auto j:i)
        {
            cout<<j<<" ";
        }
        if(!i.empty())
        {
            cout<<endl;
        }
    }
}



bool comStr(string &s1,string &s2)// S1比S2小?
{
    int s1l=s1.length();
    int s2l=s2.length();
    int s=min(s1l,s2l);
    int i=0;
    while(i<s)
    {
        if(s1[i]==s2[i])
        {
            ++i;
        }
        else
        {
            return s1[i]<s2[i];
        }
    }
    return s1l<s2l;
}
void insertSort(vector<string> &v)
{
    int i,j;
    int len=v.size();
    string temp;
    for(i=1;i<len;++i)
    {
        temp=v[i];
        j=i-1;
        while(j>=0&&comStr(temp,v[j]))
        {
            v[j+1]=v[j];
            --j;
            
        }
        v[j+1]=temp;
    }
    
}

void mySort(vector<string> &word,int n)
{
    word.clear();
    for(int i=0;i<BUCKETS_C;++i)
    {
        if(!buckets[i].empty())
        {
            insertSort(buckets[i]);
        }
    }
    
    for(auto i:buckets)
    {
        word.insert(word.end(),i.begin(),i.end());
    }
    
}

int main()
{
    const int n=10,m=12;
    vector<string> word={"java","jav","app","action","test","python","c","python","initializing","javb"};
    for(int i=0;i<n;++i)
    {
        int pos=word[i][0]-'a';
        buckets[pos].push_back(word[i]);
    }
    cout<<"------BUCKETS-----"<<endl;
    pirntBck();
    mySort(word,n);
    cout<<"-----After odering-----"<<endl;
    for(auto i:word)
    {
        cout<<i<<endl;
    }
    sort(word.begin(),word.end());
    cout<<"-----Correct order-----"<<endl;
    for(auto i:word)
    {
        cout<<i<<endl;
    }            
}


三、效果

在这里插入图片描述
上一个实验截图,可以看到在我随便敲的这个样例中是正确的~

不知道有没有Bug,欢迎指正~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值