这段代码是气泡排序程序吗?

Is this code a bubble sorting program?

本文关键字:排序 气泡 程序 段代码 代码      更新时间:2023-10-16

我做了一个简单的气泡排序程序,代码工作,但我不知道它是否正确。

我对冒泡排序算法的理解是它检查一个元素和它旁边的另一个元素。

#include <iostream>
#include <array>
using namespace std;
int main()
{

    int a, b, c, d, e, smaller = 0,bigger = 0;
    cin >> a >> b >> c >> d >> e;
    int test1[5] = { a,b,c,d,e };
    for (int test2 = 0; test2 != 5; ++test2)
    {
        for (int cntr1 = 0, cntr2 = 1; cntr2 != 5; ++cntr1,++cntr2)
        {
            if (test1[cntr1] > test1[cntr2]) /*if first is bigger than second*/{
                bigger = test1[cntr1];
                smaller = test1[cntr2];
                test1[cntr1] = smaller;  
                test1[cntr2] = bigger;
            }
        }
    }
    for (auto test69 : test1)
    {
        cout << test69 << endl;
    }
    system("pause");

}

这是一个冒泡排序实现。它只是一个非常基本的。

两个改进:

  • 外循环迭代可能每次都缩短一次,因为您可以保证前一次迭代的最后一个元素将是最大的。
  • 如果在迭代期间没有进行交换,则完成。(这是维基百科中气泡排序定义的一部分)

一些评论:

  • 使用更好的变量名(test2?)
  • 使用容器的大小或范围,不要硬编码5.
  • 使用std::swap()交换变量可以使代码更简单。

下面是一个使用(随机访问)迭代器的更通用的示例,其中包含我建议的改进和注释,以及Yves Daoust提出的改进(迭代到最后一次交换),其中包含debug-print

你的算法的正确性可以解释如下:

在第一次(内循环)中,比较T[i] > T[i+1]与可能的交换,确保T[i]中最大的T[i+1]在右边。从左到右重复所有对,确保最后T[N-1]拥有最大的元素。(数组只能通过交换来修改,这确保了没有元素丢失或重复。)

在第二次传递中,通过同样的推理,N-1中第一个元素中最大的元素被转移到T[N-2],并且它留在那里,因为T[N-1]更大。

更一般地说,在K传递中,N-K+1第一个元素中最大的元素被转移到T[N-K],留在那里,后面的元素保持不变(因为它们已经在增加)。

因此,在N通过后,所有元素都就位了。


这暗示了一个简单的优化:传递中最后一次交换之后的所有元素都到位(否则交换不会是最后一次)。因此,您可以记录最后一次交换的位置,并只执行到该位置的下一次传递。

虽然这个变化似乎没有提高很多,但它可以减少传递的次数。实际上,通过这个过程,传递的次数等于最大位移,即元素到达适当位置所需的步数(过多的元素一次只能移动一个位置)。

在某些配置中,这个数字可以很小。例如,对已经排序的数组进行排序需要一次传递,对所有元素成对交换的数组进行排序需要两次传递。这是从O(N²)到O(N)的改进!

是。你的代码就像冒泡排序一样。

输入:3 5 1 8 2

每次迭代后的输出:

                         3 1 5 2 8
                         1 3 2 5 8
                         1 2 3 5 8
                         1 2 3 5 8
                         1 2 3 5 8
                         1 2 3 5 8

实际上,在内部循环中,我们不需要从第二次迭代开始一直到数组的末尾,因为前一次迭代中最重的元素已经在最后一次迭代中了。但这并不能改善时间复杂度。所以,你可以走了。

小的非正式证明:

排序算法背后的思想是遍历值数组(从左到右)。我们就当它通过吧。在传递过程中,对值进行检查并交换以使其按正确顺序排列(右上)。

在第一次通过时将达到最大值。当达到最大值时,最大值将高于它旁边的值,因此它们将被交换。这意味着max将成为pass中下一对的一部分。这个过程一直重复,直到pass完成,max移动到数组的右端。

在第二次传递时,对于数组中第二高的值也是如此。唯一的区别是它不会在最后与max交换。现在两个最正确的值被正确设置。

在接下来的每一次传递中,一个值将被向右排序。

有N个值和N次传递。这意味着在N通过后,所有N个值将按如下方式排序:

{第k大,(k-1)第th大,......第二大,最大}

不,不是。情况更糟。在变量cntr1中没有任何意义。您应该在这里使用test1,并且您应该参考许多规范的bubblessort实现之一,而不是试图为自己创建它。