【问题标题】:How to implement bubble sort?如何实现冒泡排序?
【发布时间】:2020-09-17 21:44:30
【问题描述】:

我必须编写一个程序,接收 10 个整数然后显示它们。然后以相反的顺序显示它们。最后按升序显示它们。这是我到目前为止所拥有的。我被困在最后一部分(排序);其他一切正常。

#include <iostream>

using namespace std;

int main(){
    
    int a[10];
    for (int i = 0; i < 10; i++) 
    {
        cout << "Enter a number\n ";
        cin >> a[i];
    }
    
    cout << "Array Reversed\n";
    for (int i = 9; i >= 0; i--)
    {
        cout << a[i] << " ";
    }
    
    cout << "Numbers from lowest to highest\n";
    for (int i = a[i]; i != 0; i = i/10 )
    {
        i % 10;
        cout << i << " ";
    }
    
}

【问题讨论】:

  • 这需要有某种实际发生。首先编写一个sort 函数,该函数接受一个数组和大小的一对参数,或者更好的是一个std::vector,就像在C++ 中应该做的那样。
  • 另外,请注意i % 10; 行无效!
  • 这里的目标是编写一个冒泡排序函数还是仅仅让它们排序?
  • 残酷的事实是,大多数 C++ 课程,由于他们的“教授”,绝对是垃圾,只是你需要生存而不会受到太大破坏的东西。 C++ 是一种奇妙但极其无情的语言,它不是您可以直观地理解的东西,因此当您需要此类问题的答案时,您需要一个好的reference book 来参考。
  • @cyber_cloud 幸运的是,我不得不用一些java知识自学c++——在学习C++时假装Java不存在。如果您使用 Java 作为学习或编写 C++ 的模型,那么您最终将得到的只是错误的程序、低效的程序或对 C++ 程序员来说看起来很奇怪的程序。

标签: c++ bubble-sort


【解决方案1】:

假设你需要冒泡排序,大致思路是(伪代码):

# The array to sort.

arr = [3, 1, 4, 1, 5, 9]

# Initially assume sorting needs a pass.

hasSwapped = true
while hasSwapped:
    # If nothing swapped in this pass, we're done.

    hasSwapped = false

    # Check each element except last.

    for idx = 0 to arr.sz - 2 inclusive:
        # If bigger than next element, swap, flag another pass needed.

        if arr[idx] > arr[idx + 1]:
            temp = arr[idx]
            arr[idx] = arr[idx + 1]
            arr[idx + 1] = temp
            hasSwapped = true

您应该希望能够理解 cmets 的意图,但基本思想是:

  • 单遍将检查所有元素,如果一个大于其后的一个,它将交换它们。
  • 您必须至少完成一次
  • 如果在没有交换的情况下完成传递,则现在对数据进行排序。否则,需要更多的通行证。

您现在的工作是将其转换为您选择的语言。


我将在下面包含一个实现,该函数本身在 C 中(尽管它也可以在 C++ 中工作,正如周围的测试工具所证明的那样)。

但是,假设教育工作者不对他们提供的作业进行抄袭检查是不明智的。换句话说,不要按原样使用这段代码,你几乎肯定会被抓到。它的目的只是向您展示一个可能的实现,您可以将自己的代码与以下代码进行比较:

#include <iostream>
using namespace std;

void bubbleSort(int *arr, size_t sz) {
    int hasSwapped = 1;
    while (hasSwapped) {
        hasSwapped = 0;
        for (size_t idx = 0; idx < sz - 1; ++idx) {
            if (arr[idx] > arr[idx + 1]) {
                int temp = arr[idx];
                arr[idx] = arr[idx + 1];
                arr[idx + 1] = temp;
                hasSwapped = 1;
            }
        }
    }
}

int main() {
    int arr[] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9 };

    for (size_t i = 0; i < sizeof(arr) / sizeof(*arr); ++i)
        cout << arr[i] << ' ';
    cout << '\n';

    bubbleSort(arr, sizeof(arr) / sizeof(*arr));

    for (size_t i = 0; i < sizeof(arr) / sizeof(*arr); ++i)
        cout << arr[i] << ' ';
    cout << '\n';

    return 0;
}

输出如预期的那样:

3 1 4 1 5 9 2 6 5 3 5 9
1 1 2 3 3 4 5 5 5 6 9 9

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 2017-03-11
    • 2021-12-25
    • 2020-09-26
    • 2011-08-04
    • 1970-01-01
    • 2014-02-20
    • 2020-08-23
    相关资源
    最近更新 更多