📌  相关文章
📜  不使用多余空间将2n个整数{a1,b1,a2,b2,a3,b3,……,an,bn}随机排列

📅  最后修改于: 2021-05-05 01:22:30             🧑  作者: Mango

给定2n个元素的数组,格式为{a1,a2,a3,a4,…..,an,b1,b2,b3,b4,…。,bn}。任务是将数组改组为{a1,b1,a2,b2,a3,b3,……,an,bn},而无需使用额外的空间。

例子:

Input : arr[] = { 1, 2, 9, 15 }
Output : 1 9 2 15

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

方法1:蛮力
蛮力解决方案涉及两个嵌套循环,以将数组后半部分中的元素向左旋转。第一个循环运行n次,以覆盖数组后半部分的所有元素。第二个循环将元素向左旋转。请注意,第二个循环中的开始索引取决于我们要旋转的元素,而结束索引取决于我们需要向左移动多少个位置。

以下是此方法的实现:

C++
// C++ Naive program to shuffle an array of size 2n
#include 
using namespace std;
  
// function to shuffle an array of size 2n
void shuffleArray(int a[], int n)
{
    // Rotate the element to the left
    for (int i = 0, q = 1, k = n; i < n; i++, k++, q++)
        for (int j = k; j > i + q; j--)
            swap(a[j - 1], a[j]);
}
  
// Driven Program
int main()
{
    int a[] = { 1, 3, 5, 7, 2, 4, 6, 8 };
    int n = sizeof(a) / sizeof(a[0]);
  
    shuffleArray(a, n / 2);
  
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
  
    return 0;
}


Java
// Java Naive program to shuffle an array of size 2n
  
import java.util.Arrays;
  
public class GFG {
    // method to shuffle an array of size 2n
    static void shuffleArray(int a[], int n)
    {
        // Rotate the element to the left
        for (int i = 0, q = 1, k = n; i < n; i++, k++, q++)
            for (int j = k; j > i + q; j--) {
                // swap a[j-1], a[j]
                int temp = a[j - 1];
                a[j - 1] = a[j];
                a[j] = temp;
            }
    }
  
    // Driver Method
    public static void main(String[] args)
    {
        int a[] = { 1, 3, 5, 7, 2, 4, 6, 8 };
  
        shuffleArray(a, a.length / 2);
  
        System.out.println(Arrays.toString(a));
    }
}


Python3
# Python3 Naive program to 
# shuffle an array of size 2n
  
# Function to shuffle an array of size 2n
def shuffleArray(a, n):
  
    # Rotate the element to the left
    i, q, k = 0, 1, n
    while(i < n):     
        j = k 
        while(j > i + q):
            a[j - 1], a[j] = a[j], a[j - 1]
            j -= 1
        i += 1
        k += 1
        q += 1
  
# Driver Code
a = [1, 3, 5, 7, 2, 4, 6, 8] 
n = len(a)
shuffleArray(a, int(n / 2))
for i in range(0, n): 
    print(a[i], end = " ")
  
# This code is contributed by Smitha Dinesh Semwal.


C#
// C# Naive program to shuffle an
// array of size 2n
using System;
  
class GFG {
    // method to shuffle an array of size 2n
    static void shuffleArray(int[] a, int n)
    {
        // Rotate the element to the left
        for (int i = 0, q = 1, k = n;
             i < n; i++, k++, q++)
            for (int j = k; j > i + q; j--) {
                // swap a[j-1], a[j]
                int temp = a[j - 1];
                a[j - 1] = a[j];
                a[j] = temp;
            }
    }
  
    // Driver Code
    public static void Main()
    {
        int[] a = { 1, 3, 5, 7, 2, 4, 6, 8 };
  
        shuffleArray(a, a.Length / 2);
        for (int i = 0; i < a.Length; i++)
            Console.Write(a[i] + " ");
    }
}
  
// This code is contributed
// by ChitraNayal


C++
// C++ Effective  program to shuffle an array of size 2n
  
#include 
using namespace std;
  
// function to shuffle an array of size 2n
void shufleArray(int a[], int f, int l)
{
    if (f > l) {
        return;
    }
  
    // If only 2 element, return
    if (l - f == 1)
        return;
  
    // finding mid to divide the array
    int mid = (f + l) / 2;
  
    // using temp for swapping first half of second array
    int temp = mid + 1;
  
    // mmid is use for swapping second half for first array
    int mmid = (f + mid) / 2;
  
    // Swapping the element
    for (int i = mmid + 1; i <= mid; i++)
        swap(a[i], a[temp++]);
  
    // Recursively doing for first half and second half
    shufleArray(a, f, mid);
    shufleArray(a, mid + 1, l);
}
  
// Driven Program
int main()
{
    int a[] = { 1, 3, 5, 7, 2, 4, 6, 8 };
    int n = sizeof(a) / sizeof(a[0]);
  
    shufleArray(a, 0, n - 1);
  
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
  
    return 0;
}


Java
// Java Effective  program to shuffle an array of size 2n
  
import java.util.Arrays;
  
public class GFG {
    // method to shuffle an array of size 2n
    static void shufleArray(int a[], int f, int l)
    {
        if (f > l)
            return;
  
        // If only 2 element, return
        if (l - f == 1)
            return;
  
        // finding mid to divide the array
        int mid = (f + l) / 2;
  
        // using temp for swapping first half of second array
        int temp = mid + 1;
  
        // mmid is use for swapping second half for first array
        int mmid = (f + mid) / 2;
  
        // Swapping the element
        for (int i = mmid + 1; i <= mid; i++) {
            // swap a[i], a[temp++]
            int temp1 = a[i];
            a[i] = a[temp];
            a[temp++] = temp1;
        }
  
        // Recursively doing for first half and second half
        shufleArray(a, f, mid);
        shufleArray(a, mid + 1, l);
    }
  
    // Driver Method
    public static void main(String[] args)
    {
        int a[] = { 1, 3, 5, 7, 2, 4, 6, 8 };
  
        shufleArray(a, 0, a.length - 1);
  
        System.out.println(Arrays.toString(a));
    }
}


Python3
# Python3 effective program to 
# shuffle an array of size 2n
  
# Function to shuffle an array of size 2n
def shufleArray(a, f, l):
  
    if (f > l):
        return
  
    # If only 2 element, return
    if (l - f == 1):
        return
  
    # Finding mid to divide the array
    mid = int((f + l) / 2)
  
    # Using temp for swapping first
    # half of the second array
    temp = mid + 1
  
    # Mid is use for swapping second
    # half for first array
    mmid = int((f + mid) / 2)
  
    # Swapping the element
    for i in range(mmid + 1, mid + 1):
        (a[i], a[temp]) = (a[temp], a[i])
        temp += 1
  
    # Recursively doing for first
    # half and second half
    shufleArray(a, f, mid)
    shufleArray(a, mid + 1, l)
  
  
# Driver Code
a = [1, 3, 5, 7, 2, 4, 6, 8] 
n = len(a) 
shufleArray(a, 0, n - 1)
  
for i in range(0, n):
    print(a[i], end = " ")
  
# This code is contributed by Smitha Dinesh Semwal


C#
// C# program program to merge two
// sorted arrays with O(1) extra space.
using System;
  
// method to shuffle an array of size 2n
  
public class GFG {
    // method to shuffle an array of size 2n
    static void shufleArray(int[] a, int f, int l)
    {
        if (f > l)
            return;
  
        // If only 2 element, return
        if (l - f == 1)
            return;
  
        // finding mid to divide the array
        int mid = (f + l) / 2;
  
        // using temp for swapping first half of second array
        int temp = mid + 1;
  
        // mmid is use for swapping second half for first array
        int mmid = (f + mid) / 2;
  
        // Swapping the element
        for (int i = mmid + 1; i <= mid; i++) {
            // swap a[i], a[temp++]
            int temp1 = a[i];
            a[i] = a[temp];
            a[temp++] = temp1;
        }
  
        // Recursively doing for first half and second half
        shufleArray(a, f, mid);
        shufleArray(a, mid + 1, l);
    }
  
    // Driver Method
    public static void Main()
    {
        int[] a = { 1, 3, 5, 7, 2, 4, 6, 8 };
  
        shufleArray(a, 0, a.Length - 1);
        for (int i = 0; i < a.Length; i++)
            Console.Write(a[i] + " ");
    }
}
  
/*This code is contributed by 29AjayKumar*/


输出:

1 2 3 4 5 6 7 8 

时间复杂度: O(n 2 )

方法2 :(分而治之)
这个想法是使用分而治之的技术。将给定数组划分为一半(例如arr1 []和arr2 []),然后将arr1 []的后一半元素与arr2 []的前一半元素交换。递归地对arr1和arr2执行此操作。

让我们借助示例进行解释。

  1. 令数组为a1,a2,a3,a4,b1,b2,b3,b4
  2. 将数组分成两半:a1,a2,a3,a4:b1,b2,b3,b4
  3. 围绕中心交换元素:将a3,a4分别与b1,b2交换。
    您得到:a1,a2,b1,b2,a3,a4,b3,b4
  4. 递归地将a1,a2,b1,b2溢出到a1,a2中:b1,b2
    然后将a3,a4,b3,b4拆分为a3,a4:b3,b4。
  5. 围绕中心交换元素以获取每个子数组:
    a1,b1,a2,b2和a3,b3,a4,b4。

注意:此解决方案仅处理n = 2 i时的情况,其中i = 0、1、2等。

以下是此方法的实现:

C++

// C++ Effective  program to shuffle an array of size 2n
  
#include 
using namespace std;
  
// function to shuffle an array of size 2n
void shufleArray(int a[], int f, int l)
{
    if (f > l) {
        return;
    }
  
    // If only 2 element, return
    if (l - f == 1)
        return;
  
    // finding mid to divide the array
    int mid = (f + l) / 2;
  
    // using temp for swapping first half of second array
    int temp = mid + 1;
  
    // mmid is use for swapping second half for first array
    int mmid = (f + mid) / 2;
  
    // Swapping the element
    for (int i = mmid + 1; i <= mid; i++)
        swap(a[i], a[temp++]);
  
    // Recursively doing for first half and second half
    shufleArray(a, f, mid);
    shufleArray(a, mid + 1, l);
}
  
// Driven Program
int main()
{
    int a[] = { 1, 3, 5, 7, 2, 4, 6, 8 };
    int n = sizeof(a) / sizeof(a[0]);
  
    shufleArray(a, 0, n - 1);
  
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
  
    return 0;
}

Java

// Java Effective  program to shuffle an array of size 2n
  
import java.util.Arrays;
  
public class GFG {
    // method to shuffle an array of size 2n
    static void shufleArray(int a[], int f, int l)
    {
        if (f > l)
            return;
  
        // If only 2 element, return
        if (l - f == 1)
            return;
  
        // finding mid to divide the array
        int mid = (f + l) / 2;
  
        // using temp for swapping first half of second array
        int temp = mid + 1;
  
        // mmid is use for swapping second half for first array
        int mmid = (f + mid) / 2;
  
        // Swapping the element
        for (int i = mmid + 1; i <= mid; i++) {
            // swap a[i], a[temp++]
            int temp1 = a[i];
            a[i] = a[temp];
            a[temp++] = temp1;
        }
  
        // Recursively doing for first half and second half
        shufleArray(a, f, mid);
        shufleArray(a, mid + 1, l);
    }
  
    // Driver Method
    public static void main(String[] args)
    {
        int a[] = { 1, 3, 5, 7, 2, 4, 6, 8 };
  
        shufleArray(a, 0, a.length - 1);
  
        System.out.println(Arrays.toString(a));
    }
}

Python3

# Python3 effective program to 
# shuffle an array of size 2n
  
# Function to shuffle an array of size 2n
def shufleArray(a, f, l):
  
    if (f > l):
        return
  
    # If only 2 element, return
    if (l - f == 1):
        return
  
    # Finding mid to divide the array
    mid = int((f + l) / 2)
  
    # Using temp for swapping first
    # half of the second array
    temp = mid + 1
  
    # Mid is use for swapping second
    # half for first array
    mmid = int((f + mid) / 2)
  
    # Swapping the element
    for i in range(mmid + 1, mid + 1):
        (a[i], a[temp]) = (a[temp], a[i])
        temp += 1
  
    # Recursively doing for first
    # half and second half
    shufleArray(a, f, mid)
    shufleArray(a, mid + 1, l)
  
  
# Driver Code
a = [1, 3, 5, 7, 2, 4, 6, 8] 
n = len(a) 
shufleArray(a, 0, n - 1)
  
for i in range(0, n):
    print(a[i], end = " ")
  
# This code is contributed by Smitha Dinesh Semwal

C#

// C# program program to merge two
// sorted arrays with O(1) extra space.
using System;
  
// method to shuffle an array of size 2n
  
public class GFG {
    // method to shuffle an array of size 2n
    static void shufleArray(int[] a, int f, int l)
    {
        if (f > l)
            return;
  
        // If only 2 element, return
        if (l - f == 1)
            return;
  
        // finding mid to divide the array
        int mid = (f + l) / 2;
  
        // using temp for swapping first half of second array
        int temp = mid + 1;
  
        // mmid is use for swapping second half for first array
        int mmid = (f + mid) / 2;
  
        // Swapping the element
        for (int i = mmid + 1; i <= mid; i++) {
            // swap a[i], a[temp++]
            int temp1 = a[i];
            a[i] = a[temp];
            a[temp++] = temp1;
        }
  
        // Recursively doing for first half and second half
        shufleArray(a, f, mid);
        shufleArray(a, mid + 1, l);
    }
  
    // Driver Method
    public static void Main()
    {
        int[] a = { 1, 3, 5, 7, 2, 4, 6, 8 };
  
        shufleArray(a, 0, a.Length - 1);
        for (int i = 0; i < a.Length; i++)
            Console.Write(a[i] + " ");
    }
}
  
/*This code is contributed by 29AjayKumar*/

输出:

1 2 3 4 5 6 7 8 

时间复杂度: O(n log n)

线性时间解决方案