代码之家  ›  专栏  ›  技术社区  ›  user6527938

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

  •  0
  • user6527938  · 技术社区  · 8 年前

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

    #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;
    }
    

    输出

    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
    

    我不知道为什么第一个元素会变为零。如果我在没有气泡排序循环的情况下运行它,它会运行得很好,但没有使用这些循环。

    3 回复  |  直到 8 年前
        1
  •  0
  •   Vlad from Moscow    8 年前

    在此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;
            }
        }
    }
    
        2
  •  0
  •   Bo R    8 年前

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

    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;
            }
    
        3
  •  0
  •   QuIcKmAtHs    8 年前

    密码

    #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]);
    }
    

    解释

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