Open In App

Sort an array which contain 1 to n values

Last Updated : 09 Oct, 2024
Summarize
Comments
Improve
Suggest changes
Like Article
Like
Share
Report
News Follow

We are given an array that contains 1 to n elements, our task is to sort this array in an efficient way. We are not allowed to simply copy the numbers from 1 to n.
Examples : 

Input : arr[] = {2, 1, 3};
Output : {1, 2, 3}

Input : arr[] = {2, 1, 4, 3};
Output : {1, 2, 3, 4} 

Native approach – O(n Log n) Time and O(1) Space

We use a O(n Log n) sorting algorithm and it is possible to achieve with O(1) space. In the below implementation, we have simply used a library function.

C++
#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    // Input array containing elements from 1 to n
    vector<int> arr = { 3, 1, 4, 2, 5 };

    sort(arr.begin(), arr.end());

    for (int x : arr) {
        cout << x << " ";
    }
    return 0;
}
Java Python JavaScript

Output
1 2 3 4 5 

Better Approach – Counting Sort – O(n) Time and O(n) Space

We can use counting sort to achieve this in linear time. Note that the counting sort keeps array values only and does not copy values from 1 to n.

Efficient Approach 1 – O(n) Time and O(1) Space

Follow the steps mentioned below to solve the problem. The idea is based on Cycle Sort algorithm

  • Traverse the array 
    • If the element is at its correct position, do not do anything
    • Else swap the element with the element at its correct position
C++
#include <bits/stdc++.h>
using namespace std;

// Function to sort the array 
void sort(vector<int>& arr) {
    int i = 0;
    while (i < arr.size()) {
      
        // If element is not at its correct 
        // position, swap it
        if (arr[arr[i] - 1] != arr[i]) {
            swap(arr[i], arr[arr[i] - 1]);  
          
        } else {
            i++;
        }
    }
}

// Driver Code
int main() {
    vector<int> arr = {3, 2, 5, 6, 1, 4};
    sort(arr);
    for (int x : arr) 
        cout << x << " ";
    return 0;
}
Java Python C# JavaScript

Output
1 2 3 4 5 6 

Illustration

arr[] = {3, 1, 2}

i = 0 : arr[0] = 3, Swap arr[0] and arr[2], arr[] = {2, 1, 3}

i = 0 : arr[0] = 2. Swap arr[0] and arr[1]. arr[] = {1, 2, 3}

i = 0 : arr[0] is already in its correct position, i = 1
i = 1 : arr[1] is already in its correct position, i = 2
i = 2 : arr[0] is already in its correct position, i = 3

Why is this linear or O(n) Time? For every element in the array, the algorithm swaps it to its correct position only once. So we do at most n swaps And if we do not do a swap, we increment i. So the total work done is around 2n

Efficient Approach 2 – O(n) Time and O(1) Space

We can also solve this problem by storing old and new values together at an index with the help of remainder. Let’s say for any index i, we have the current element as arr[i]. We know that the correct index for arr[i], say correctIdx is (arr[i] – 1). Now, instead of overwriting arr[correctIdx], we add (arr[i] * (n + 1)) to arr[correctIdx]. This is because we can get the original value by arr[i] % (n + 1) and updated value by arr[i] / (n + 1).

After traversing the array and modifying each index, traverse again and update arr[i] to arr[i] / (n + 1) to get the sorted values. Please refer the below link for detailed implementation.

Sort an array which contains 1 to n values – Set 2




Next Article
Practice Tags :

Similar Reads

three90RightbarBannerImg