【问题标题】:Pointer Based Bubble Sort in C++C++中基于指针的冒泡排序
【发布时间】:2015-11-25 03:46:16
【问题描述】:

我一直试图让代码在 C++ 中使用基于指针的冒泡排序对用户输入的数组进行排序。代码编译没有错误,但数组没有排序。指针从来都不是我的强项,我无法让它们正常工作。这是我的代码。

#include <iostream>
using namespace std;

int main()
{
    int arr[10];
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        cout << "Enter a number: ";
        cin >> arr[i];
    }

    int *ptr = &i;
    for (int j = 0; j < 9; j++)
    {
        if (*(ptr + j) > *(ptr + j + 1))
        {
            int temp = *(ptr + j);
            *(ptr + j) = *(ptr + j + 1);
            *(ptr + j + 1) = temp;
        }
    }

    cout << endl;
    for (i = 0; i < 10; i++)
        cout << arr[i] << "\t";

    cin.ignore();
    cin.get();
}

感谢大家的帮助。

【问题讨论】:

  • 很久没看C++代码了,你可以试试改指针 int *ptr = &i;指向数组 arr[0] 的开头,否则我认为您只是指向 i 的内存地址,这不会帮助您对 arr[] 中的节点重新排序...

标签: c++ arrays sorting pointers


【解决方案1】:

你有 3 个错误:

  1. 正如@Lukasz P. 在评论中提到的,int* ptr 应该指向数组arrint* ptr = arr;
  2. 您对最后一个元素的访问越界(当j = 8 时)
  3. 你需要继续排序,直到没有更多的交换:

    bool sorted = false; // keep track here whether you still need to sort
    int *ptr = arr;
    while (!sorted) // repeat this until no more swaps
    {
        sorted = true;
        for (int j = 0; j < 8 ; j++) // Repeat until N - 1 (i.e. 8 in this case)
        {
            if (*(ptr + j ) > *(ptr + j + 1)) // make sure you don't access out of bounds
            {
                int temp = *(ptr + j);
                *(ptr + j) = *(ptr + j + 1);
                *(ptr + j + 1) = temp;
                sorted = false; // we swapped, so keep sorting
            }
        }
    }
    

【讨论】:

  • 我觉得这里效率低下;你不应该拥有break;(加上其他更改)。如果考虑数组 [9, 1, 2, 3, 4]。在 9 被移动一次之后,当这个检查已经完成时,你检查 1 > {2,9} 3 次。我认为这个想法是在每个 while 循环中通过整个数组。这样,任何“气泡”都会一次传播到顶部(或底部)。此外,数组应该在每个 for 循环开始时被认为是排序的,直到有交换为止。
  • @racitup 忘记了我的 BubbleSort :) 已更改。
猜你喜欢
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 2012-02-10
  • 2012-02-17
  • 1970-01-01
  • 2014-02-18
  • 2015-06-21
  • 2015-08-25
相关资源
最近更新 更多