我正在尝试冒泡排序.有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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出如下
知道为什么数学不会出现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 两两比较。但我想你可以考虑将元素交换为另一个。不管怎样,所做的只是改变常数,而不是更重要的部分。