冒泡排序最坏的例子是O(n * n),怎么样?

时间:2009-12-20 01:24:32

标签: c# algorithm

我正在尝试冒泡排序。有5个元素,数组未排序。泡沫排序的最坏情况是O(n ^ 2)。

作为一个例子,我正在使用

A = {5,4,3,2,1}

在这种情况下,比较应为5 ^ 2 = 25。 使用手动验证和代码,我得到比较计数为20。 以下是冒泡排序实现代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SortingAlgo
{
class Program
{
    public static int[] bubbleSort(int[] A)
    {
        bool sorted = false;
        int temp;
        int count = 0;
        int j = 0;
            while (!sorted)
            {
                j++;
                sorted = true;
                for (int i = 0; i < (A.Length - 1); i++)
                {
                    count++;
                    if(A[i] > A[i+1])
                    {
                        temp = A[i];
                        A[i] = A[i+1];
                        A[i+1] = temp;
                        sorted = false;
                    }

                    Console.Write(count + ". -> ");
                    for(int k=0; k< A.Length; k++)
                    {
                        Console.Write(A[k]);
                    }
                    Console.Write("\n");

                }                
            }
      return A;

    }

    static void Main(string[] args)
    {
        int[] A = {5, 4, 3, 2, 1};
        int[] B = bubbleSort(A);
        Console.ReadKey();
    }
   } 
  }

输出正在跟随

  1. - &GT; 45321
  2. - &GT; 43521
  3. - &GT; 43251
  4. - &GT; 43215
  5. - &GT; 34215
  6. - &GT; 32415
  7. - &GT; 32145
  8. - &GT; 32145
  9. - &GT; 23145
  10. - &GT; 21345
  11. - &GT; 21345
  12. - &GT; 21345
  13. - &GT; 12345
  14. - &GT; 12345
  15. - &GT; 12345
  16. - &GT; 12345
  17. - &GT; 12345
  18. - &GT; 12345
  19. - &GT; 12345
  20. - &GT; 12345
  21. 知道为什么数学不出来是25?

6 个答案:

答案 0 :(得分:28)

Big-O表示法并没有告诉您算法需要多少次迭代(或多长时间)。随着元素数量的增加(通常朝向无穷大),它表示函数的增长

因此,在您的情况下,O(n 2 )仅表示冒泡排序的计算资源以平方为单位数量增长。所以,如果你有两倍的元素,你可以期望它(最坏的情况)花费4倍的时间(作为界限)。如果你有4倍的元素,复杂性会增加16倍。等等。

对于具有O(n 2 )复杂度的算法,五个元素可以进行25次迭代,或25,000次迭代。没有分析算法就没有办法说出来。同样,具有O(1)复杂度(恒定时间)的函数可能需要0.000001秒执行或执行两周。

答案 1 :(得分:9)

如果算法采用n^2 - n次操作,则仍会简化为O(n^2)。 Big-O表示法只是算法缩放的近似值,而不是对特定输入所需操作数量的精确测量。

答案 2 :(得分:5)

考虑一下:你的例子,对5个元素进行冒泡排序,需要进行5x4 = 20次比较。这推广到N个元素的冒泡排序需要N x(N-1)= N ^ 2 - N比较,并且N ^ 2非常快地得到比N大的LOT。这就是O(N ^ 2)来自的地方。 (例如,对于20个元素,您正在查看380个比较。)

答案 3 :(得分:4)

冒泡排序是一种特殊情况,其完整复杂度为(n *(n-1)) - 它为您提供正确的数字:5个元素导致5 *(5-1)操作,即20,是你在最坏的情况下发现的。

然而,简化的Big O notation删除了常量和最不显着增长的项,并且只给出了O(n ^ 2)。这样可以很容易地将它与其他实现和算法进行比较,这些实现和算法可能没有完全(n *(n-1)),但是当简化时,显示工作如何随着更大的输入而增加。

比较Big O表示法要容易得多,对于大型数据集,常量和次要项可忽略不计。

答案 4 :(得分:3)

请记住,O(N ^ 2)是从C * N(2)的实际表达式简化而来的;也就是说,有一个有界的常数。例如,对于冒泡排序,C大约为1/2(不完全,但接近)。

你的比较计数也是关闭的,我认为应该是10次成对比较。但我想你可以考虑将元素交换成另一个元素。无论哪种方式,所做的只是改变常数,而不是更重要的部分。

答案 5 :(得分:1)

for (int i=4; i>0; i--) {     
    for (int j=0; j<i;j++) {
        if (A[j]>A[j+1]){
        swapValues(A[j],A[j+1]);
            ................

5(0:4)元素的比较计数应为10.

i=4 - {(j[0] j[1]) (j[1] j[2]) (j[2] j[3]) (j[3] j[4])} - 4 comparisons
i=3 - {(j[0] j[1]) (j[1] j[2]) (j[2] j[3])} - 3 comparisons
i=2 - {(j[0] j[1]) (j[1] j[2])} - 2 comparisons
i=1 - {(j[0] j[1])} - 1 comparison