你好我被要求通过使用二分搜索而不是线性提高插入排序。现在的问题是,由于数据比较,现在最好的情况是O(n log n),而不是O(n),这使得程序在某些情况下如果不是较慢,就等于。这里是我的二进制插入排序代码:直接和二进制插入排序
void InsertionSort(int data[], int size)
{
int index = -1;
for(int i = 1,temp,j;i<size;i++)
{
temp = data[i];//DM O(N)
int high = i,low = 0,mid;//DM O(N)
while(low <= high)//DC O(nlogn)
{
mid = (low + high) /2;
if(temp < data[mid])
{
high = mid - 1;
index = mid;
}
else if (temp > data[mid])
{
low = mid + 1;
}
else if(data[mid] == temp)
{
index = mid;
break;
}
}
for(j = i;j > index;j--)
{
data[j] = data[j-1];//DC Worst Case O(n*n) but the exact is summation of n(n+1)/2 nad best case o(1)
}
data[j] = temp;//DM O(n)
}
}
但它是改善最坏的情况下,对吧? – 2013-03-03 11:12:13
@OliCharlesworth不,它仍然是O(n * n),因为它会产生n(n + 1)/ 2个移位 – user1948105 2013-03-03 11:13:08
事实上,这不会影响渐近复杂性,但它可能会改善实践中的运行时间。 – 2013-03-03 11:15:20