为什么使用选择排序对字符串进行排序不正常?

时间:2016-02-03 14:11:26

标签: c++ sorting selection-sort

此代码没有给出任何语法错误但是有一些逻辑错误,我无法找到它。 守则是:

#include<iostream>
#include<cstring>
void SortString(std::string str, int size)
{
    int min;
    for(int i = 0; i < size-2; i++)
    {
        min = i;
        for(int j = i+1; j < size-2; j++)
        {
            if( str[j] < str[min] )
                min = j;
        }
        char temp = str[i];
        str[i] = str[min];
        str[min] = temp;
    }
    std::cout<<std::endl<<str<<std::endl;
}
int main()
{
    std::string str;
    std::cout<<"\n Enter a string to sort : ";
    std::getline(std::cin, str);
    std::cout<<"\n String after sorting is : \n";
    SortString(str, strlen(str.c_str()));;
    //std::cout<<str<<std::endl;
    return 0;
}

很少有输出实例:

1。     输入要排序的字符串:lovely

 String after sorting is : 

elovly

2

Enter a string to sort : program

 String after sorting is : 

goprram

这个逻辑适用于整数数组的排序。但它不适用于字符串。

3 个答案:

答案 0 :(得分:3)

要注意的关键是,如果你看看你的两个例子:

lovely ==>
elovly

program ==>
goprram

它看起来像什么?对我而言,除了最后的两个字符外,它看起来都在排序。

你的循环边界是什么样的?

for(int i = 0; i < size-2; i++)
{
    min = i;
    for(int j = i+1; j < size-2; j++)

你正在跳过最后两个角色!将界限更改为size

std::string知道自己的大小,有一个成员函数:size()(或length())。所以你不需要strlen()。然后SortString()实际上对字符串进行复制并在内部对其进行排序,如果您通过引用对其进行排序,将会更有用。最后,存在std::swap()

void SortString(std::string& str)
{
    int min;
    for(int i = 0; i < str.size(); i++)
    {
        min = i;
        for(int j = i+1; j < str.size(); j++)
        {
            if( str[j] < str[min] )
                min = j;
        }

        std::swap(str[i], str[min]);
    }
}

答案 1 :(得分:0)

为什么你算到大小 - 2?这样你就不会看到最后两个字符

答案 2 :(得分:0)

首先,声明第二个参数没有多大意义,因为std::string类型的对象会在其自身内部保留有关其大小的信息。

外循环中的这种情况

for(int i = 0; i < size-2; i++)
               ^^^^^^^^^^

错了。例如,如果字符串只有两个字符,如"BA",则很明显size等于2,循环将永远不会迭代。也就是说,不会交换字符来获取排序后的字符串"AB"

该功能可以按以下方式编写

void SortString( std::string str )
{
    for ( std::string::size_type i = 0; i < str.size(); i++ )
    {
        std::string::size_type min = i;
        for ( std::string::size_type j = i + 1; j < str.size(); j++ )
        {
            if ( str[j] < str[min] ) min = j;
        }
        if ( i != min ) std::swap( str[i], str[min] );
    }

    std::cout << std::endl << str << std::endl;
}