Given an array arr[] and an integer k, sort the array in ascending order while keeping the element at index k fixed at its original position. Return the resulting array.
Examples:
Input: arr[] = [10, 4, 11, 7, 6, 20], k = 2
Output: [4, 6, 11, 7, 10, 20]
Explanation: The element 11 at index 2 remains fixed, while all other elements are sorted in ascending order.
Input: arr[] = [30, 20, 10], k = 0
Output: [30, 10, 20]
Explanation: The element 30 at index 0 remains fixed, while the remaining elements are sorted in ascending order.
Table of Content
[Naive Approach] Using Temporary Array - O(n log n) Time O(n) Space
The idea is to keep the element at index k fixed and store all the remaining elements in a temporary array. Sort the temporary array and place the sorted elements back into the original array while skipping index k. This ensures that the element at index k remains unchanged and all other elements are sorted in ascending order.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void sortExceptK(vector<int> &arr, int k)
{
vector<int> temp;
// Store all elements except arr[k]
for (int i = 0; i < arr.size(); i++)
{
if (i != k)
{
temp.push_back(arr[i]);
}
}
// Sort remaining elements
sort(temp.begin(), temp.end());
// Place sorted elements back
int idx = 0;
for (int i = 0; i < arr.size(); i++)
{
if (i != k)
{
arr[i] = temp[idx++];
}
}
}
// Driver Code
int main()
{
vector<int> arr = {30, 20, 10};
int k = 0;
sortExceptK(arr, k);
cout << "[";
for (int i = 0; i < arr.size(); i++)
{
cout << arr[i];
if (i != arr.size() - 1)
{
cout << ", ";
}
}
cout << "]";
return 0;
}
import java.util.Arrays;
public class GfG {
public static void sortExceptK(int[] arr, int k)
{
int[] temp = new int[arr.length - 1];
// Store all elements except arr[k]
int idx = 0;
for (int i = 0; i < arr.length; i++) {
if (i != k) {
temp[idx++] = arr[i];
}
}
// Sort remaining elements
Arrays.sort(temp);
// Place sorted elements back
idx = 0;
for (int i = 0; i < arr.length; i++) {
if (i != k) {
arr[i] = temp[idx++];
}
}
}
public static void main(String[] args)
{
int[] arr = { 30, 20, 10 };
int k = 0;
sortExceptK(arr, k);
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if (i != arr.length - 1) {
System.out.print(", ");
}
}
System.out.print("]");
}
}
from typing import List
def sortExceptK(arr: List[int], k: int):
temp = []
# Store all elements except arr[k]
for i in range(len(arr)):
if i != k:
temp.append(arr[i])
# Sort remaining elements
temp.sort()
# Place sorted elements back
idx = 0
for i in range(len(arr)):
if i != k:
arr[i] = temp[idx]
idx += 1
# Driver Code
if __name__ == "__main__":
arr = [30, 20, 10]
k = 0
sortExceptK(arr, k)
print("[", end="")
for i in range(len(arr)):
print(arr[i], end="")
if i != len(arr) - 1:
print(", ", end="")
print("]")
using System;
using System.Collections.Generic;
class GfG {
static void sortExceptK(List<int> arr, int k)
{
List<int> temp = new List<int>();
// Store all elements except arr[k]
for (int i = 0; i < arr.Count; i++) {
if (i != k) {
temp.Add(arr[i]);
}
}
// Sort remaining elements
temp.Sort();
// Place sorted elements back
int idx = 0;
for (int i = 0; i < arr.Count; i++) {
if (i != k) {
arr[i] = temp[idx++];
}
}
}
// Driver Code
static void Main()
{
List<int> arr = new List<int>{ 30, 20, 10 };
int k = 0;
sortExceptK(arr, k);
Console.Write("[");
for (int i = 0; i < arr.Count; i++) {
Console.Write(arr[i]);
if (i != arr.Count - 1) {
Console.Write(", ");
}
}
Console.Write("]");
}
}
function sortExceptK(arr, k)
{
var temp = [];
// Store all elements except arr[k]
for (var i = 0; i < arr.length; i++) {
if (i !== k) {
temp.push(arr[i]);
}
}
// Sort remaining elements
temp.sort(function(a, b) { return a - b });
// Place sorted elements back
var idx = 0;
for (var i = 0; i < arr.length; i++) {
if (i !== k) {
arr[i] = temp[idx++];
}
}
}
// Driver Code
var arr = [ 30, 20, 10 ];
var k = 0;
sortExceptK(arr, k);
console.log("[");
for (var i = 0; i < arr.length; i++) {
console.log(arr[i]);
if (i !== arr.length - 1) {
console.log(", ");
}
}
console.log("]");
Output
[30, 10, 20]
Time Complexity: O(n log n)
Auxiliary Space: O(n)
[Expected Approach] Move to End and Sort In-Place - O(n log n) Time O(1) Space
The idea is to temporarily move the element at index
kto the end.. Then, sort the firstn - 1elements. Finally, move the fixed element back to its original position by repeatedly swapping it with its previous element. This sorts all elements except the one at indexkwhile using constant extra space.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void sortExceptK(vector<int> &arr, int k)
{
int n = arr.size();
// Move the element at index k to the end to keep it unmoved
swap(arr[n - 1], arr[k]);
// Sort the array except the last element (formerly at index k)
sort(arr.begin(), arr.end() - 1);
// Shift sorted elements to restore the original position of k
for (int i = n - 2; i >= k; --i)
{
swap(arr[i], arr[i + 1]);
}
}
// Driver Code
int main()
{
vector<int> arr = {30, 20, 10};
int k = 0;
sortExceptK(arr, k);
cout << "[";
for (int i = 0; i < arr.size(); i++)
{
cout << arr[i];
if (i != arr.size() - 1)
{
cout << ", ";
}
}
cout << "]";
return 0;
}
import java.util.Arrays;
public class GfG {
static void sortExceptK(int[] arr, int k)
{
int n = arr.length;
// Move the element at index k to the end
int temp = arr[n - 1];
arr[n - 1] = arr[k];
arr[k] = temp;
// Sort the array except the last element
Arrays.sort(arr, 0, n - 1);
// Shift sorted elements to restore the original
// position of k
for (int i = n - 2; i >= k; --i) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
// Driver Code
public static void main(String[] args)
{
int[] arr = { 30, 20, 10 };
int k = 0;
sortExceptK(arr, k);
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if (i != arr.length - 1) {
System.out.print(", ");
}
}
System.out.print("]");
}
}
def sortExceptK(arr, k):
n = len(arr)
# Move the element at index k to the end
arr[n - 1], arr[k] = arr[k], arr[n - 1]
# Sort the array except the last element
arr[:n - 1] = sorted(arr[:n - 1])
# Shift sorted elements to restore the original position of k
for i in range(n - 2, k - 1, -1):
arr[i], arr[i + 1] = arr[i + 1], arr[i]
# Driver Code
if __name__ == "__main__":
arr = [30, 20, 10]
k = 0
sortExceptK(arr, k)
print("[", end="")
for i in range(len(arr)):
print(arr[i], end="")
if i != len(arr) - 1:
print(", ", end="")
print("]")
using System;
using System.Collections.Generic;
class GfG {
static void sortExceptK(List<int> arr, int k)
{
int n = arr.Count;
// Move the element at index k to the end
int temp = arr[n - 1];
arr[n - 1] = arr[k];
arr[k] = temp;
// Sort the array except the last element
arr.Sort(0, n - 1, Comparer<int>.Default);
// Shift sorted elements to restore the original
// position of k
for (int i = n - 2; i >= k; --i) {
int t = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = t;
}
}
// Driver Code
static void Main()
{
List<int> arr = new List<int>{ 30, 20, 10 };
int k = 0;
sortExceptK(arr, k);
Console.Write("[");
for (int i = 0; i < arr.Count; i++) {
Console.Write(arr[i]);
if (i != arr.Count - 1) {
Console.Write(", ");
}
}
Console.Write("]");
}
}
function sortExceptK(arr, k)
{
const n = arr.length;
// Move the element at index k to the end to keep it
// unmoved
[arr[n - 1], arr[k]] = [ arr[k], arr[n - 1] ];
// Sort the array except the last element (formerly at
// index k)
arr.slice(0, n - 1).sort((a, b) => a - b);
// Shift sorted elements to restore the original
// position of k
for (let i = n - 2; i >= k; --i) {
[arr[i], arr[i + 1]] = [ arr[i + 1], arr[i] ];
}
}
// Driver Code
const arr = [ 30, 20, 10 ];
const k = 0;
sortExceptK(arr, k);
console.log("[" + arr.join(", ") + "]");
Output
[30, 10, 20]
Time Complexity: O(n log n)
Auxiliary Space: O(1)