我正在尝试冒泡排序.有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();
    }
   } 
  }
输出如下
知道为什么数学不会出现25?
Rob*_*ino 28
Big-O表示法不会告诉您算法将采用多少次迭代(或多长时间).它是生长的指示速度的函数的元素的增加(通常朝向无穷大)的数量.
因此,在您的情况下,O(n 2)只是意味着冒泡排序的计算资源以平方增长为元素数量.所以,如果你有两倍的元素,你可以期望它(最坏的情况)4倍(作为一个上限).如果你有4倍的元素,复杂性会增加16倍.
对于具有O(n 2)复杂度的算法,五个元素可以进行25次迭代,或25,000次迭代.没有分析算法就没有办法说出来.同样,具有O(1)复杂度(恒定时间)的函数可能需要0.000001秒执行或执行两周.
考虑一下:您的示例,对5个元素进行冒泡排序,需要进行5x4 = 20次比较.这推广到N个元素的冒泡排序需要N x(N-1)= N ^ 2 - N比较,并且N ^ 2非常快地得到比N大的LOT.这就是O(N ^ 2)来自的地方.(例如,对于20个元素,您正在查看380个比较.)
请记住,O(N^2) 是从 C * N(2) 的实际表达式简化而来的;也就是说,存在一个有界常数。例如,对于冒泡排序,C 大约为 1/2(不完全是,但很接近)。
你的比较次数也少了,我想,应该是 10 两两比较。但我想你可以考虑将元素交换为另一个。不管怎样,所做的只是改变常数,而不是更重要的部分。