こんにちは、線形ではなく二分探索を使用して挿入ソートを改善するように依頼されました。問題は、データ比較により、最良のケースが O(n) ではなく O(n log 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)
}
}