c ++ sort(升序,降序)整数数组

时间:2016-10-25 09:44:14

标签: c++ arrays sorting

所以我是C ++的新手,我在这里尝试一些初学练习就是问题:我必须按升序和降序排序一个整数数组,但每次我尝试升序时都有一个0在我的数组中无处不在,取代了之前的数组整数。只有当我使用"升序顺序时才会发生这种情况。选项。我已经尝试重新排列阵列中的数字并更改它们但是同样的事情发生了我真的无法解决问题。我会感激一些帮助,我希望我的问题不是愚蠢而浪费你的时间。

#include<iostream>
using namespace std;

int main()
{

int i,y,choice,temp,am[5]={8,6,10,7,9};

cout<<"Choice 1 : Descending\nChoice 2 : Ascending\n";
cin>>choice;

if(choice==1)
{
    for(i=0;i<5;i++)
    {
        y=i+1;
        while(y<5)
        {
            while(am[i]<am[y])
            {
                temp=am[i];
                am[i]=am[y];
                am[y]=temp;
                y++;
            }
            y++;
        }
    }
}
else if(choice==2)
{
    for(i=0;i<5;i++)
    {
        y=i+1;
        while(y<5)
        {
            while(am[i]>am[y])
            {
                temp=am[i];
                am[i]=am[y];
                am[y]=temp;
                y++;
            }
            y++;
        }
    }
}
else
    cout<<"Error\n";

for(i=0;i<5;i++)
    cout<<"am[i]:"<<am[i]<<"\n";

return 0;
}

here is what i see in cmd

3 个答案:

答案 0 :(得分:0)

您正在使用选择排序。你的程序有4个错误。使用&#39; 如果&#39;而不是

#include<iostream>
using namespace std;

int main()
{
    int i,y,choice,temp,am[5]={8,6,10,7,9};

    cout<<"Choice 1 : Descending\nChoice 2 : Ascending\n";
    cin>>choice;

    if(choice==1)
    {
        for(i=0;i<5;i++)
        {
            y=i+1;
            while(y<5)
            {
                if(am[i]<am[y])    //Correction1
                {
                    temp=am[i];
                    am[i]=am[y];
                    am[y]=temp;
                    //y++;         //Correction2
                }
                y++;
            }
        }
    }
    else if(choice==2)
    {
        for(i=0;i<5;i++)
        {
            y=i+1;
            while(y<5)
            {
                if(am[i]>am[y])      //Correction3
                {
                    temp=am[i];
                    am[i]=am[y];
                    am[y]=temp;     
                    //y++;          //Correction4
                }
                y++;
            }
        }
    }
    else
        cout<<"Error\n";

    for(i=0;i<5;i++)
        cout<<"am[i]:"<<am[i]<<"\n";

    return 0;
}

答案 1 :(得分:0)

失败的原因。

每次迭代中算法的变化:

am[0]:6
am[1]:8
am[2]:10
am[3]:7
am[4]:9

am[0]:6
am[1]:7
am[2]:10
am[3]:8
am[4]:9

am[0]:6
am[1]:7
am[2]:8
am[3]:10
am[4]:9

am[0]:6
am[1]:7
am[2]:8
am[3]:9
am[4]:10
am[0]:6
am[1]:7
am[2]:8
am[3]:0
am[4]:10

am[i]:6
am[i]:7
am[i]:8
am[i]:0
am[i]:10

现在希望你能解决它。

答案 2 :(得分:0)

我相信这一点:

while(am[i]>am[y])
{
   temp=am[i];
   am[i]=am[y];
   am[y]=temp;
   y++;
}

一般可能会导致问题。我的意思是,你增加y,但不检查它是否小于数组长度(在这种情况下是5),所以我认为在某些情况下它会开始比较和交换元素来自超越阵列。我很惊讶你还没有得到段错误。 这个问题似乎出现在两个选项中(升序和降序)。

我将使用和while语句更改此if循环,并从中删除y++

if(am[i]>am[y])
{
   temp=am[i];
   am[i]=am[y];
   am[y]=temp;
}

这样,父while循环仍处理递增y并检查它是否小于5但我们无法解决数组之外的问题。 我不确定它是否会解决问题,虽然0出现在任何地方,所以它最有可能来自阵列之外的某个地方,并且因为它出现在接近排序结束的某个地方它不会下降,因为你的算法假设(并且正确地说btw)所有先前的元素已经被排序。

我建议你实现冒泡排序,因为它易于理解和实现,并且具有一些优化潜力(我对它进行了优化以至于它最糟糕的情况比合并排序更快...不知道为什么虽然)。