using System.Collections.Generic;
using System.Diagnostics;
public static void Main()
List<long> entityList = new List<long>();
for (int i=0; i<entityLen; ++i)
entityList.Add( i*(dataLen/entityLen) + (dataLen/entityLen)/2 );
long[] dataList = new long [dataLen];
for (int i=0; i<dataLen; ++i)
Stopwatch stopWatch = new Stopwatch();
foundIndex = SearchIndex(entityList[listCount], ref dataList, foundIndex, dataLen-1);
if (foundIndex == -1) break;
if (listCount == entityList.Count) break;
long elapsed01 = stopWatch.ElapsedTicks;
Console.WriteLine("instances found: {0}. Elapsed Time, 1st method: {1} ticks, {2} iterations", listCount, elapsed01, iterations);
List<long> results = new List<long>();
stopWatch = new Stopwatch();
SearchAndDivideRange(ref entityList, 0, entityList.Count-1, ref dataList, 0, dataLen-1, ref results);
long elapsed02 = stopWatch.ElapsedTicks;
foreach(long index in results)
Console.WriteLine("instances found: {0}. Elapsed Time, 2nd method: {1} ticks, {2} iterations", results.Count, elapsed02, iterations);
static private void SearchAndDivideRange(ref List<long> entityList, int eStart, int eEnd, ref long[] dataList, int dataStart, int dataEnd, ref List<long> results)
if (eEnd < eStart || dataEnd < dataStart) return;
int eMid = eStart + (eEnd-eStart)/2;
int midDataIndex = SearchIndex(entityList[eMid], ref dataList, dataStart, dataEnd);
results.Add(midDataIndex);
int dataStartLeft = dataStart;
int dataEndLeft = midDataIndex == -1 ? dataEnd : midDataIndex-1;
SearchAndDivideRange(ref entityList, eStartLeft, eEndLeft, ref dataList, dataStartLeft, dataEndLeft, ref results);
int dataStartRight = midDataIndex == -1 ? dataStart : midDataIndex+1;
int dataEndRight = dataEnd;
int eStartRight = eMid+1;
SearchAndDivideRange(ref entityList, eStartRight, eEndRight, ref dataList, dataStartRight, dataEndRight, ref results);
static private int SearchIndex(long entity, ref long[] dataList, int dataStart, int dataEnd)
while (dataStart <= dataEnd)
mid = (dataStart + dataEnd) / 2;
long target = dataList[mid];