Input: SORTED array, target

Output: element_index or -1 if is not present in array

Complexity:

step == 1 → $O(n)$ (linear search)

step == n → subsearch complexity

step ≠ 1 && step ≠ n → $\begin{cases} O(\frac{n}{step}+step), & \text{if subsearch is linear search} \\ O(\frac{n}{step}+\log{step}), & \text{if subsearch is binary search} \end{cases}$

Algorithm:

<aside> ⚙️

Безымянный.png

Псевдокод, где ещё требуется реализовать проверку, не перепрыгнули ли конец

#define STEP 2 // you can choose step whatever you want
if (target == array[0]) {
	printf(0); 
	exit(); 
}
if (target < array[0]) {
	printf("No such element in array\\n"); 
	exit(); 
}
if (target > array[0]) {
	int i = 1; 
	while (i < n) {
		if (target == array[0+i*STEP]) {
			printf(i*STEP); 
			exit(); 
		}
		if (target < array[0+i*STEP]) {
			subsearch(array[(i-1)*STEP: i*STEP], target); 
			exit(); 
		}
		if (target > array[0+i*STEP]) {
			i++; 
      // ещё должна быть проверка, не перепрыгнули ли конец
		}
	}
}

Псевдокод с реализованной проверкой на выход за границу массива и улучшенными границами subsearch:

#define STEP 2 // you can choose step whatever you want
if (target == array[0]) {
	printf(0); 
	exit(); 
}
if (target < array[0]) {
	printf("No such element in array\\n"); 
	exit(); 
}
while (i*step <= n) {
    if (target == array[0+i*STEP]) {
      printf(i*step); 
      exit(); 
    }
    if (target < array[0+i*STEP]) {
      subsearch(array[(i-1)*STEP+1 : i*STEP-1], target); 
      // + и - 1 т.к. i*STEPи (i-1)*step мы уже проверяли на совпадение с target
      exit(); 
    }
    if (target > array[0+i*step]) {
      i++; 
    }
  }
  subsearch(array[(i-1)*STEP+1 : n-1], target); 
  // если i*STEP выходит за размер массива и при этом меньше, чем target

</aside>