我做了以下代码来检查冒泡排序和插入排序所需的迭代次数和交换次数。即使(参考下面的代码)插入排序与冒泡排序相比确实进行了一半的迭代和相同数量的交换,那么两者如何具有相同的BIG-O复杂度
static void bubbleSortExample()
{
int iterationCount=0;
int swaps=0;
int [] arr={2,6,1,4,8,7,10,3};
int temp=0;
for(int i=0; i< arr.length; i++)
{
iterationCount=iterationCount+1;
for(int j=0; j<arr.length-1; j++)
{
iterationCount=iterationCount+1;
if(arr[j]> arr[j+1])
{
swaps= swaps+1;
temp= arr[j+1];
arr[j+1]= arr[j];
arr[j]= temp;
}
}
}
System.out.println("Bubble Sort----Iteration count are : " + iterationCount + " and swaps are : " + swaps);
}
//Bubble Sort Example Ends
//Insertion Sort Example Starts
static void insertionSortExample()
{
int iterationCount=0;
int swaps=0;
int [] arr={2,6,1,4,8,7,10,3};
for(int i=1;i< arr.length;i++)
{
iterationCount=iterationCount+1;
int key=arr[i];// this is the number that needs to be inserted in its correct position
for(int j=i-1; j >= 0; j--)
{
iterationCount=iterationCount+1;
if(key < arr[j])
{
swaps= swaps+1;
int t= arr[j];
arr[j]=key;
arr[j+1]=t;
}
}
}
System.out.println("Insertion Sort----Iteration count are : " + iterationCount + " and swaps are : " + swaps);
}
输出
Bubble Sort----Iteration count are : 64 and swaps are : 9
Insertion Sort----Iteration count are : 35 and swaps are : 9
答案 0 :(得分:3)
哇!哇!等等。你混淆了两件事 一个是运行时间,这是一个程序在输入实例上的实际运行时间 其次是时间复杂度,这是随着输入大小的增长,运行时间的增长。
O(N ^ 2)的程序运行速度比实际中的O(NlogN)代码快得多。这是因为输入可能主要是平均情况,但Big-Oh分析仅适用于最坏的情况分析。这是因为Big-Oh没有告诉实际的运行时间(这可能取决于输入的性质(最佳情况/最差情况),实际实施的细节).Big-Oh只给我们一个保证算法的运行时间不会超过函数的常数。
您可以阅读我的答案here以澄清这些答案。
因此,当我们说冒泡排序/插入排序是O(N 2 )时,我们的意思是说最坏情况下的运行时间不大于常数N ^ 2 。实现这两种算法确实如此。
如果您仍然有困惑,请随时提出。
答案 1 :(得分:1)
请记住,符号只表示算法在n增长时的行为方式。线性因子总是从中掉落。所以它确实没有说明算法是否很快,它只是说明当你增加n时需要花费更多时间来完成什么因素。
答案 2 :(得分:0)
在第i次迭代的冒泡排序中,你有ni-1内迭代(n ^ 2)/ 2总数,但是在插入排序中,你在第i步上有最大的i次迭代,但平均而言是i / 2,你可以在找到当前元素的正确位置后,先停止内循环。
所以你有(总和从0到n)/ 2,总共是(n ^ 2)/ 4;
这就是为什么插入排序比冒泡排序更快的原因。