Algorithms Clrcular shlfted array It is given a sorted circu
Algorithms: Clrcular shlfted array
It is given a sorted circularIy shifted array. This is an array of sorted unique integers such that each eIement has been shifted k positions to the right with eIements wrapping around. In other words if the Iength of the array is L, the vaIue at index i in the sorted array will be at index (i+k) % L in the sorted circularIy shifted array.
Write pseudocode such that if you are given a sorted circuIarly shifted array, you wiII return the maximum eIement.
The code must run asymptotically faster than (n).
Solution
Linear search (Time Complexity: O(n)):
#include <stdio.h>
int findMaximum(int arr[], int low, int high)
{
int max = arr[low];
int i;
for (i = low; i <= high; i++)
{
if (arr[i] > max)
max = arr[i];
}
return max;
}
/* Driver program to check above functions */
int main()
{
int arr[] = {1, 30, 40, 50, 60, 70, 23, 20};
int n = sizeof(arr)/sizeof(arr[0]);
printf(\"The maximum element is %d\", findMaximum(arr, 0, n-1));
getchar();
return 0;
}
Binary search (Time Complexity: O(Logn)):
#include <stdio.h>
int findMaximum(int arr[], int low, int high)
{
/* Base Case: Only one element is present in arr[low..high]*/
if (low == high)
return arr[low];
/* If there are two elements and first is greater then
the first element is maximum */
if ((high == low + 1) && arr[low] >= arr[high])
return arr[low];
/* If there are two elements and second is greater then
the second element is maximum */
if ((high == low + 1) && arr[low] < arr[high])
return arr[high];
int mid = (low + high)/2; /*low + (high - low)/2;*/
/* If we reach a point where arr[mid] is greater than both of
its adjacent elements arr[mid-1] and arr[mid+1], then arr[mid]
is the maximum element*/
if ( arr[mid] > arr[mid + 1] && arr[mid] > arr[mid - 1])
return arr[mid];
/* If arr[mid] is greater than the next element and smaller than the previous
element then maximum lies on left side of mid */
if (arr[mid] > arr[mid + 1] && arr[mid] < arr[mid - 1])
return findMaximum(arr, low, mid-1);
else // when arr[mid] is greater than arr[mid-1] and smaller than arr[mid+1]
return findMaximum(arr, mid + 1, high);
}
/* Driver program to check above functions */
int main()
{
int arr[] = {1, 3, 50, 10, 9, 7, 6};
int n = sizeof(arr)/sizeof(arr[0]);
printf(\"The maximum element is %d\", findMaximum(arr, 0, n-1));
getchar();
return 0;

