×

DS - Basics

DS - Array

DS - Linked List

DS - Stack

DS - Queue

DS Hashing

DS Tree

DS - Graph

DS Programs Using C/C++

DS - Miscellaneous Topics

Search an element in a sorted and rotated array

Last Updated : April 19, 2025

Consider an integer array of size n that is sorted in ascending order and then rotated using a pivot value which is unknown. Now if the array is just sorted, we can search an element using binary search with a time complexity of O(log(n)). But since the array is rotated, frame a solution to find an element in the given array in O(log(n)) time.

Example:

Input:
array[]= {5, 1, 2, 3, 4}
element = 1

Output:
Element is present at index: 4

Input:
array[]= {50, 10, 20, 30, 40}
element = 5

Output:
Element is not present

Search an element in a sorted and rotated array using find pivot value and search

This is a simple approach that involves finding the pivot element in the given array. The pivot element is the one that has a value greater than its next element. After finding it we can split the array into two parts and perform a binary search on them individually to find the desired element. It involves the following steps:

  • Iterate through the array
  • Find the pivot element by checking whether the element is greater than its following element
  • Divide the array at the pivot value into two groups
  • Call either of the two groups for binary search by checking the group's first element with the element to be searched
  • If found, print the element's index

C++ Implementation

#include <bits/stdc++.h>
using namespace std;

// Function to perform binary search
int binarySearch(int array[], int low, int high, int element)
{
    if (high < low)
        return -1;

    int mid = (low + high) / 2;
    if (element == array[mid])
        return mid;

    if (element > array[mid])
        return binarySearch(array, (mid + 1), high, element);

    return binarySearch(array, low, (mid - 1), element);
}

// Function to find the pivot element
int findPivot(int array[], int low, int high)
{
    // base cases
    if (high < low)
        return -1;
    if (high == low)
        return low;

    int mid = (low + high) / 2;
    if (mid < high && array[mid] > array[mid + 1])
        return mid;

    if (mid > low && array[mid] < array[mid - 1])
        return (mid - 1);

    if (array[low] >= array[mid])
        return findPivot(array, low, mid - 1);

    return findPivot(array, mid + 1, high);
}

// Function to search an element
// In sorted and rotated array
int searchElement(int array[], int length, int element)
{
    int pivot = findPivot(array, 0, length - 1);

    // If the array is not rotated
    if (pivot == -1)
        return binarySearch(array, 0, length - 1, element);

    // if element at pivot is the element to be search
    if (array[pivot] == element)
        return pivot;

    if (array[0] <= element)
        return binarySearch(array, 0, pivot - 1, element);

    return binarySearch(array, pivot + 1, length - 1, element);
}

// Main function
int main()
{
    int array[100], N, element;
    
    cout << "Enter Number of elements: ";
    cin >> N;

    for (int i = 0; i < N; i++) {
        cout << "Enter element " << i + 1 << ":";
        cin >> array[i];
    }
    cout << "Enter the element to be searched: ";
    cin >> element;

    int index = searchElement(array, N, element);
    if (index == -1) {
        cout << "Element is not present";
    }
    else {
        cout << "Element is present at index: " << index;
    }

    return 0;
}

Output:

Enter Number of elements: 6
Enter element 1:4
Enter element 2:5
Enter element 3:6
Enter element 4:1
Enter element 5:2
Enter element 6:3
Enter the element to be searched: 2
Element is present at index: 4

Time Complexity: O(log(n)), where n is the length of the array.

Search an element in a sorted and rotated array using modified binary search

This is an updated method from the previous solution and it does not require finding the pivot element. It involves the following steps:

  • Assign low=0 and high=n-1
  • Find mid=(low+high)/2
  • Check if array[mid] is the element to be search, if yes, return mid
  • Else if, check array[low..mid] is sorted. If yes, recursively call array[low..mid] if element lies in array[low..mid]. If not, recursively call array[mid+1..high]
  • Else, the array[mid+1..high] should be sorted. Check element lies in array[mid+1..high]. If yes, recursively call array[mid+1..high], else recursively call array[low..mid]
  • Print the element's index

C++ Implementation

#include <bits/stdc++.h>
using namespace std;

int search(int array[], int low, int high, int element)
{
    if (low > high)
        return -1;

    int mid = (low + high) / 2;
    if (array[mid] == element)
        return mid;

    // If array[low..mid] is sorted
    if (array[low] <= array[mid]) {

        // check the whether element lies in first half
        if (element >= array[low] && element <= array[mid])
            return search(array, low, mid - 1, element);

        return search(array, mid + 1, high, element);
    }

    // array[mid+1..high] will be sorted
    if (element >= array[mid] && element <= array[high])
        return search(array, mid + 1, high, element);

    return search(array, low, mid - 1, element);
}

// Main function
int main()
{
    int array[100], N, element;
    
    cout << "Enter Number of elements: ";
    cin >> N;

    for (int i = 0; i < N; i++) {
        cout << "Enter element " << i + 1 << ":";
        cin >> array[i];
    }
    cout << "Enter the element to be searched: ";
    cin >> element;

    int index = search(array, 0, N - 1, element);
    if (index == -1) {
        cout << "Element is not present";
    }
    else {
        cout << "Element is present at index: " << index;
    }

    return 0;
}

Output:

Enter Number of elements: 5
Enter element 1:4
Enter element 2:5
Enter element 3:1
Enter element 4:2
Enter element 5:3
Enter the element to be searched: 3
Element is present at index: 4

Time Complexity: O(log(n)), where n is the length of the array.

Related Tutorials

Advertisement
Advertisement


Comments and Discussions!

Load comments ↻


Advertisement
Advertisement
Advertisement

Copyright © 2025 www.includehelp.com. All rights reserved.