我正在尝试冒泡排序。有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?
答案 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