冒泡排序忽略数组的第一个元素

问题描述 投票:1回答:3

我正在做作业,但不知道为什么冒泡排序不起作用。由于某些未知原因,它正在使数组的第一个元素为零。

#include <iostream>

using namespace std;

int main()
{
    int *arr,s;
    cout<<"Enter the quantity of numbers ";
    cin>>s;
    arr=new int[s];
    for(int i=0;i<s;i++)
    {
        cout<<"Enter number "<<i+1<<" ";
        cin>>*(arr+i);
    }
    int temp;
    for(int j=0;j<s;j++)
    {
        for(int k=0;k<(s-j);k++)
        {
            if(*(arr+k)>*(arr+k+1))
            {
                temp=*(arr+k);
                *(arr+k)=*(arr+k+1);
                *(arr+k+1)=temp;
            }
        }
    }
    for(int x=0;x<s;x++)
    {
        cout<<*(arr+x)<<"\t";
    }
    cout<<endl;
    return 0;
}

OUTPUT

Enter the quantity of numbers 5
Enter number 1 4
Enter number 2 33
Enter number 3 22
Enter number 4 1
Enter number 5 3
0       1       3       4       22

我不知道为什么第一个元素变为零。如果我运行它没有冒泡排序循环它运行完美但不与这些循环。

c++ arrays sorting for-loop bubble-sort
3个回答
1
投票

在这个for循环中

    for(int k=0;k<(s-j);k++)
    {
        if(*(arr+k)>*(arr+k+1))
                      ^^^^^^^ 
        {
            temp=*(arr+k);
            *(arr+k)=*(arr+k+1);
            *(arr+k+1)=temp;
        }

j等于0并且k等于s - 1时,尝试访问超出数组的内存。在这种情况下,k + 1等于s,尽管指数的有效范围是[0, s-1]

至少以下列方式更改循环

for(int j=0;j<s;j++)
{
    for(int k = 1;k<(s-j);k++)
    {
        if(*(arr+k) < *(arr+k-1))
        {
            int temp=*(arr+k);
            *(arr+k)=*(arr+k-1);
            *(arr+k-1)=temp;
        }
    }
}

0
投票

您对索引的使用已关闭。您正在从有效范围之外获取垃圾值(它们恰好是零)。更简单的样式可能有助于检测问题。

for(int j=0;j<s;j++)
{
    for(int k=1;k<s;k++)
    {
        if(arr[k-1]>arr[k])
        {
            int temp=arr[k];
            arr[k]=arr[k-1];
            arr[k-1]=temp;
        }

0
投票

Code

#include <bits/stdc++.h>
using namespace std;
int N, a[10050];
int main() {
    scanf("%d", &N);
    for (int i = 0; i < N; i++) scanf("%d" , &a[i]);
    for (int k = 0; k < N; k++) {
        int mn = k;
        for (int i = k+1; i < N; ++i) {
            if (a[i] < a[mn]) mn = i;
        }
        swap(a[k], a[mn]);
    }
    for (int i = 0; i < N; i++) printf("%d " , a[i]);
}

Explanation

在冒泡排序中,您可以递归地交换元素。这是一个15行代码。希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.