泡沫分类是我们可以使用的最简单排序算法之一,用于对数组或结构进行排序。虽然在C程序中实现如此简单,但是气泡排序也被认为是低效排序算法。在要排序的元素总数如此小的情况下,泡沫排序可以方便地(可能在100的范围内)。当数据大小是大/巨大的气泡排序很少用于实际编程世界。让我们通过将其作为C程序来详细分析泡沫分类算法。

笔记:-由于算法在借助于2循环仅,它可以原样用于C / C ++或Java等任何编程语言

泡泡排序的工作: -

考虑订单5,4,3,2,11中的5个元素数组。我们需要使用泡沫排序按升序排序此列表。泡沫排序算法的概念很简单,我们可以用2个步骤解释。

为了简化解释,我将考虑按升序排序。

  • 第1步:-将列表的第一个成员与下一个元素进行比较。按升序排序,我们通常通过检查First元素是否大于下一个元素来开始流程。如果是,我们相应地互换了他们的位置。即第一元素被移动到第二元素的位置,第二个元素移动到第一元素的位置。如果不是,那么我们不互换任何元素。如下一步,将第二位置中的元素与第三位置的元素进行比较,并且如果需要,执行交换元件的过程。比较和互换的整个过程重复到最后一个元素。完成过程后,数组中的最大元素将放在列表/数组的最后位置。
  • 注1步骤1: -这里要注意的是,我们连续比较两个元素,即我们比较第1和第二个元素 - 然后是第2和第3个元素 - 然后是第3和第4个,最后第4和第5个。因此,比较总数为4(对于5个元素的数组/列表)。如果有要分类的“n”元素,那么要制作的比较总数是= n-1
  • 第2步:-步骤1中的整个过程重复5次以获得1,2,3,4,5的排序阵列。如果存在要分类的N个元素,则步骤1的整个过程重复'n'次。
因此,使用2对于循环,可以以C语言实现这两个步骤算法。只需看到以下: -


for(i = 0;一世 [j + 1])//用于比较两个连续元素的条件。
{
temp = a [j];// 3以下陈述用于互换元素的位置。
a [j] = a [j + 1];
[j + 1] = temp;
}
}
}

您可以参考下面给出的2个图像以更好地理解气泡排序算法。图像是用于以上述代码片段写入的循环的2的工作流的图纸。
泡沫排序算法现在,您可以轻松找到“泡沫排序”算法的效率。如果有'n'元素,则它是n * n的顺序。这只是因为它需要几乎没有比较次数。

修改泡泡排序: -

我建议您分析这两个步骤(步骤1和步骤2)和仔细图像。现在你可以观察一个事实。在第一次之后,可以减少1的比较次数为了环形。在上面的示例中以升序排序,最大的数字5在第一次通过后到达最后一个位置。它是一个固定的位置,我们确信这个列表中没有大于5的数字。因此,我们可以减少下一步通过的比较次数1.同样在第二次通过之后,第二大数字(4)在第二个最后位置(在5之前)固定。因此,我们可以在下一个通过中再次减少比较数量。这种修改提高了气泡排序的速度。修改后的代码片段如下所示。

for(i = 0;一世 A [J + 1])
{
temp = a [j];
a [j] = a [j + 1];
[j + 1] = temp;
}
}
}

使用这种新的修改代码,我们可以提高泡沫排序的速度。

泡沫排序的最佳案例和最坏情况场景: -

最佳案例是当算法提供其最大效率(和快速性能),其中最坏情况是它提供最小效率(最慢的性能)。在泡沫排序的情况下,最好的情况是当要排序的阵列处于完美的顺序时(按排序顺序)。例子:-采用以下订单1,2,3,4,5的阵列,我们需要按升序排序。在这种情况下,阵列已被分类!因此,使用泡沫排序实现此项时,排序算法仅进行比较。在算法工作时,任何时间都没有发生元素的交换。因此,泡沫分类以其最大效率执行,并且仅需要最短的时间。最糟糕的情况泡沫排序是我们需要对按降序排列的数组进行排序,以按升序排序,反之亦然。考虑按顺序5,4,3,2,1的阵列的情况,我们需要使用泡沫排序以按升序对此数组进行排序。在这种情况下,该算法使得最大数量的比较次数以及最大数量的元素交换。因此,该算法提供了最糟糕的性能(最长时间)

提高C中的算法性能

在分析排序算法时,可能会发生许多情况/方案。就像最好的案例和最坏的情况一样。在排序阵列1,2,3,4,5的最佳案例方案中,我们已经看到了“没有元素交换”发生任何时间(通过算法的工作)。现在考虑另一种方案排序一系列订单1,2,3,5,4;这里只有最后2个元素不是顺序,其中前3个元素是按顺序的。根据泡沫排序算法,在完成循环的第一次通过后,最大元素将占用最后位置。这意味着,在第一次通过之后,阵列将成为1,2,3,4,5 - 并且它被排序。因此,在这种情况下,首先剩下的4次通过为了循环是浪费时间。第一次通过后,只有元素的比较将会发生,并且没有“元素交流”

从这个分析来看,我们可以得出结论。如果循环的特定通行证(例如第3次)导致“无需交换元素”,则可以假设,阵列已被排序。因此,我们可以通过发出断点或使用标志来跳过其余的通过循环。通过这样做,我们节省了很多时间可能丢失了不必要的循环。可以使用以下代码片段实现此修改。

for(i = 0;一世 A [J + 1])
{
temp = a [j];
a [j] = a [j + 1];
[j + 1] = temp;

标志= 0;//标志被设置为零,因为发生了“元素交换”
}
}
}

希望你明白了“泡沫排序”算法很好。如果您有任何疑问,请在评论部分询问。

作者

6.注释

  1. 亚洲·库马尔哈尔达尔

    #包括
    int main(){

    int s,temp,i,j,a [20];

    printf(“输入元素的总数:”);
    scanf(“%d”,&s);

    printf(“输入%d元素:”,s);
    for(i = 0; i = 0; i - ){
    for(j = 0; ja [j + 1]){
    temp = a [j];
    a [j] = a [j + 1];
    [j + 1] = temp;
    }
    }
    }

    printf(“排序后:”);
    for(i = 0; i printf(“%d”,a [i]);

    返回0;
    }
    请清除循环

  2. 亚洲·库马尔哈尔达尔

    #包括
    int main(){

    int s,temp,i,j,a [20];

    printf(“输入元素的总数:”);
    scanf(“%d”,&s);

    printf(“输入%d元素:”,s);
    for(i = 0; i = 0; i - ){
    for(j = 0; ja [j + 1]){
    temp = a [j];
    a [j] = a [j + 1];
    [j + 1] = temp;
    }
    }
    }

    printf(“排序后:”);
    for(i = 0; i = 0; i - ){
    for(j = 0; ja [j + 1]){
    temp = a [j];
    a [j] = a [j + 1];
    [j + 1] = temp;
    请清除它。
    谢谢

  3. Karan.

    善的解释伙计留着它。

  4. javed iqbal.

    Awsome !!这对我帮助很大!!:P.

  5. Saranya Thangaraj.

    我无法在这里使用标志变量......你可以在这个代码中解释标志变量概念吗????

  6. 萨维尔

    plz .......continue写作文章通过c教程!!!它有助于像我这样的初学者!

Baidu