Измешајте 2n цели броеви како a1-b1-a2-b2-a3-b3 - .. bn без да користите дополнителен простор


Ниво на тешкотија Медиум
Често прашувано во Adobe ДЕ Шо Expedia Фанатици Навистина PayU
Низа Подели и освои Рекурзија

Изјава за проблем

Ти е даден низа of цели броеви. Проблемот „Измешај 2n цели броеви како a1-b1-a2-b2-a3-b3 - .. bn без да користиш дополнителен простор“ бара да се измешаат сите броеви во низата, така што броевите да бидат како (x0, x1, x2, x3, y0, y1, y2, y3) ќе се мешаат како x0, y0, x1, y1, x2, y2, x3, y3 и така натаму на овој начин.

пример

arr[]={1, 3, 5, 7, 2, 4, 6, 8}
1, 2, 3, 4, 5, 6, 7, 8

Објаснување

Ако споредиме од првите три броја ќе бидат како x0, x1, x2 и следните три броја ќе бидат како y0, y1, y2, и тоа ќе биде подредено во x0, y0, x1, y1, x2, y2.

Измешајте 2n цели броеви како a1-b1-a2-b2-a3-b3 - .. bn без да користите дополнителен простор

Алгоритам за мешање на 2n цели броеви како a1-b1-a2-b2-a3-b3 - .. bn без користење дополнителен простор

1. Find out the middle index of the array.
2. While middleIndex greater than 0, set count and swappingIndex to middleIndex.
  1. While the count is greater than 0, do the following steps.
    1. Swap the values at swappingIndex and swappingIndex +1(value next to swappingIndex).
    2. Increase the value of swapping index by 1.
  2. Decrease the value of middleIndex by 1.
3. Print the array.

Објаснување

Дадовме една низа of цел број.  Потоа, од нас се бара да ги измешаме сите цели вредности на, особено даден начин. Beе поминеме само половина од низата. И замена на сите вредности што доаѓаат според алгоритмот. Прво, ќе провериме дали низата не треба да биде нула. Исто така, должината на низата треба да биде рамномерна. Затоа ја проверуваме состојбата дека должината на низите не треба да биде непарна. Ако било кое од горенаведените услови е лажно, тогаш тоа нема да произведе излез.

Willе го дознаеме средниот индекс на низата и потоа ќе ја провериме вредноста на тој индекс и неговата следна вредност на индексот и едноставно ќе го замениме. За тоа, ние ќе го користиме вгнезденото додека јамка во првата додека е јамка. Тогаш ќе го поминеме од тој тековен индекс на 0 и ќе ја намалуваме вредноста на средниот индекс. Во внатрешноста додека јамка, ние ќе ја зачуваме истата вредност како индекс на струја во swappingIndex и потоа ќе ја земеме вредноста на swappingIndex и нејзината следна вредност и ќе ја замениме. За втората размена, зголемете ја вредноста на swappingIndex и направете замена за тековната swappingIndex и вредноста на нејзиниот следен индекс.

За следното поминување, ќе ја намалиме вредноста на средниот индекс. Така што може да ги земе вредностите од предната страна на низата. Слично на тоа, броењето и разменувањетоIndex ќе бидат исти со вредноста на средната вредност на индексот што ја намаливме за да ги поминеме претходните вредности на низата. По целото менување што го направивме, ќе ја испечатиме таа низа и сите броеви ќе се мешаат на даден начин.

Код

C ++ код за мешање на цели броеви како a2-b1-a1-b2-a2-b3 - .. bn без користење на дополнителен простор

#include<iostream>
using namespace std;

void shuffleInt(int arr[], int n)
{
    if (arr == NULL || n % 2 == 1)
        return;

    int middleIndex = (n - 1) / 2;

    while (middleIndex > 0)
    {
        int countIndex = middleIndex, swappingIndex = middleIndex;

        while (countIndex -- > 0)
        {
            int temp = arr[swappingIndex + 1];
            arr[swappingIndex + 1] = arr[swappingIndex];
            arr[swappingIndex] = temp;
            swappingIndex++;
        }
        middleIndex--;
    }
}
int main()
{
    int arr[] = {1, 9, 25, 4, 16, 36};
    int n = sizeof(arr) / sizeof(arr[0]);
    shuffleInt(arr, n);
    for (int i = 0; i < n; i++)
        cout << arr[i]<<" ";
}
1 4 9 16 25 36

Java код за мешање на цели броеви како a2-b1-a1-b2-a2-b3 - .. bn без користење дополнителен простор

class Shuffle2nIntegers
{
    public static void shuffleInt(int[] arr)
    {

        if (arr == null || arr.length % 2 == 1)
            return;

        int middleIndex = (arr.length - 1) / 2;


        while (middleIndex > 0)
        {
            int countIndex = middleIndex, swappingIndex = middleIndex;

            while (countIndex -- > 0)
            {
                int temp = arr[swappingIndex + 1];
                arr[swappingIndex + 1] = arr[swappingIndex];
                arr[swappingIndex] = temp;
                swappingIndex++;
            }
            middleIndex--;
        }
    }

    public static void main(String[] args)
    {
        int arr[] = {1, 9, 25, 4, 16, 36};
        shuffleInt(arr);
        for (int i = 0; i < arr.length; i++)
            System.out.print( arr[i]+" ");
        System.out.println();
    }
}
1 4 9 16 25 36

Анализа на сложеност

Временска комплексност

О (n ^ 2) каде „Н“ е бројот на елементи во низата. Како и секој пат кога го намалуваме средниот индекс за еден. Но, внатрешната јамка работи за MiddleIndex неколку пати. Можете да го сметате за едноставни две вгнездени јамки каде надворешната јамка тече од i = 0 до n внатрешната јамка тече од i + 1 до. Така, временската комплексност е полином.

Комплексноста на просторот

О (1), бидејќи алгоритмот е алгоритам на место. Тоа е сите операции што се прават за да ги заменат почетните елементи на низата '. И која било од новите низи не е направена.