Verification: a143cc29221c9be0

Php array sort two arrays

Php array sort two arrays

Сортировка массива

Метод sort() сортирует массив по алфавиту:

Пример

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();        // Сортирует элементы фруктов

Попробуйте сами »


Обращение массива

Метод reverse() изменяет элементы в массиве.

Вы можете использовать его для сортировки массива в порядке убывания:

Пример

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();        // Сначала сортируем элементы фруктов
fruits.reverse();     // Затем меняем порядок элементов

Попробуйте сами »


Числовая сортировка

По умолчанию sort() функция сортирует значения как строки.

Это хорошо работает для струнных ("Apple" стоит перед "Banana").

Однако, если числа сортируются как строки, "25" больше "100", потому что "2" больше "1".

Из-за этого sort() метод при сортировке чисел дает неверный результат.

Вы можете исправить это, предоставив функцию сравнения:

Пример

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});

Попробуйте сами »

Используйте тот же прием для сортировки массива по убыванию:

Пример

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});

Попробуйте сами »



Функция сравнения

Цель функции сравнения - определить альтернативный порядок сортировки.

Функция сравнения должна возвращать отрицательное, нулевое или положительное значение в зависимости от аргументов:

function(a, b){return a - b}

Когда sort() функция сравнивает два значения, она отправляет значения в функцию сравнения и сортирует значения в соответствии с возвращенным (отрицательным, нулевым, положительным) значением.

Если результат отрицательный a, сортировка производится раньше b.

Если результат положительный b, сортировка производится раньше a.

Если результат равен 0, то порядок сортировки двух значений не изменяется.

Пример:

Функция сравнения сравнивает все значения в массиве, по два значения за раз (a, b).

При сравнении 40 и 100 sort() метод вызывает функцию сравнения (40, 100).

Функция вычисляет от 40 до 100 (a - b), и поскольку результат отрицательный (-60), функция сортировки отсортирует 40 как значение ниже 100.

Вы можете использовать этот фрагмент кода, чтобы поэкспериментировать с числовой и алфавитной сортировкой:


function myFunction1() {
  points.sort();
  document.getElementById("demo").innerHTML = points;
}

function myFunction2() {
  points.sort(function(a, b){return a - b});
  document.getElementById("demo").innerHTML = points;
}

Попробуйте сами »


Сортировка массива в случайном порядке

Пример

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return 0.5 - Math.random()});

Попробуйте сами »


Метод Фишера Йейтса

Приведенный выше пример array.sort() не является точным, некоторые числа будут предпочтительнее других.

Самый популярный правильный метод - перетасовка Фишера Йейтса - был введен в науку о данных еще в 1938 году!

В JavaScript этот метод можно перевести так:

Пример

var points = [40, 100, 1, 5, 25, 10];

for (i = points.length -1; i > 0; i--) {
  j = Math.floor(Math.random() * i)
  k = points[i]
  points[i] = points[j]
  points[j] = k
}

Попробуйте сами »


Найдите наибольшее (или наименьшее) значение массива

Нет встроенных функций для поиска максимального или минимального значения в массиве.

Однако после того, как вы отсортировали массив, вы можете использовать индекс для получения наибольшего и наименьшего значений.

Сортировка по возрастанию:

Пример

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
// теперь points[0] содержит наименьшее значение
// и points[points.length-1] содержит наибольшее значение

Попробуйте сами »

Сортировка по убыванию:

Пример

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
// теперь points[0] содержит самое высокое значение
// и points[points.length-1] содержит самое низкое значение

Попробуйте сами »

Сортировка всего массива - очень неэффективный метод, если вы хотите найти только самое высокое (или самое низкое) значение.


Использование Math.max () в массиве

Вы можете использовать Math.max.apply для поиска наибольшего числа в массиве:

Пример

function myArrayMax(arr) {
  return Math.max.apply(null, arr);
}

Попробуйте сами »

Math.max.apply(null, [1, 2, 3]) эквивалентно Math.max(1, 2, 3).


Использование Math.min() в массиве

Вы можете использовать Math.min.apply для поиска наименьшего числа в массиве:

Пример

function myArrayMin(arr) {
  return Math.min.apply(null, arr);
}

Попробуйте сами »

Math.min.apply(null, [1, 2, 3]) эквивалентно Math.min(1, 2, 3).


Минимальные / максимальные методы JavaScript

Самое быстрое решение - использовать "самодельный" метод.

Эта функция просматривает массив, сравнивая каждое значение с наибольшим найденным значением:

Пример (Найти Max)

function myArrayMax(arr) {
  var len = arr.length;
  var max = -Infinity;
  while (len--) {
    if (arr[len] > max) {
      max = arr[len];
    }
  }
  return max;
}

Попробуйте сами »

Эта функция просматривает массив, сравнивая каждое значение с наименьшим найденным значением:

Пример (Найти Min)

function myArrayMin(arr) {
  var len = arr.length;
  var min = Infinity;
  while (len--) {
    if (arr[len]       min = arr[len];
    }
  }
  return min;
}

Попробуйте сами »


We strongly recommend that you click here and practice it, before moving on to the solution.

Method 1 (Using Sorting and Binary Search) 
Let the size of A1[] be m and the size of A2[] be n. 

  • Create a temporary array temp of size m and copy the contents of A1[] to it.
  • Create another array visited[] and initialize all entries in it as false. visited[] is used to mark those elements in temp[] which are copied to A1[].
  • Sort temp[]
  • Initialize the output index ind as 0.
  • Do following for every element of A2[i] in A2[] 
    • Binary search for all occurrences of A2[i] in temp[], if present then copy all occurrences to A1[ind] and increment ind. Also mark the copied elements visited[]
  • Copy all unvisited elements from temp[] to A1[]

Below image is a dry run of the above approach:


Below is the implementation of the above approach: 
 

C++

#include

using namespace std;

int first(int arr[], int low, int high, int x, int n)

{

    if (high >= low) {

        int mid = low + (high - low) / 2;

        if ((mid == 0 || x > arr[mid - 1]) && arr[mid] == x)

            return mid;

        if (x > arr[mid])

            return first(arr, (mid + 1), high, x, n);

        return first(arr, low, (mid - 1), x, n);

    }

    return -1;

}

void sortAccording(int A1[], int A2[], int m, int n)

{

    int temp[m], visited[m];

    for (int i = 0; i

        temp[i] = A1[i];

        visited[i] = 0;

    }

    sort(temp, temp + m);

    int ind = 0;

    for (int i = 0; i

        int f = first(temp, 0, m - 1, A2[i], m);

        if (f == -1)

            continue;

        for (int j = f; (j

            A1[ind++] = temp[j];

            visited[j] = 1;

        }

    }

    for (int i = 0; i

        if (visited[i] == 0)

            A1[ind++] = temp[i];

}

void printArray(int arr[], int n)

{

    for (int i = 0; i

        cout " ";

    cout

}

int main()

{

    int A1[] = { 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 };

    int A2[] = { 2, 1, 8, 3 };

    int m = sizeof(A1) / sizeof(A1[0]);

    int n = sizeof(A2) / sizeof(A2[0]);

    cout "Sorted array is \n";

    sortAccording(A1, A2, m, n);

    printArray(A1, m);

    return 0;

}

Java

import java.io.*;

import java.util.Arrays;

class GFG {

    static int first(int arr[], int low, int high,

                     int x, int n)

    {

        if (high >= low) {

            int mid = low + (high - low) / 2;

            if ((mid == 0 || x > arr[mid - 1]) && arr[mid] == x)

                return mid;

            if (x > arr[mid])

                return first(arr, (mid + 1), high,

                             x, n);

            return first(arr, low, (mid - 1), x, n);

        }

        return -1;

    }

    static void sortAccording(int A1[], int A2[], int m,

                              int n)

    {

        int temp[] = new int[m], visited[] = new int[m];

        for (int i = 0; i

            temp[i] = A1[i];

            visited[i] = 0;

        }

        Arrays.sort(temp);

        int ind = 0;

        for (int i = 0; i

            int f = first(temp, 0, m - 1, A2[i], m);

            if (f == -1)

                continue;

            for (int j = f; (j

                 j++) {

                A1[ind++] = temp[j];

                visited[j] = 1;

            }

        }

        for (int i = 0; i

            if (visited[i] == 0)

                A1[ind++] = temp[i];

    }

    static void printArray(int arr[], int n)

    {

        for (int i = 0; i

            System.out.print(arr[i] + " ");

        System.out.println();

    }

    public static void main(String args[])

    {

        int A1[] = { 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 };

        int A2[] = { 2, 1, 8, 3 };

        int m = A1.length;

        int n = A2.length;

        System.out.println("Sorted array is ");

        sortAccording(A1, A2, m, n);

        printArray(A1, m);

    }

}

Python3

def first(arr, low, high, x, n) :

    if (high >= low) :

        mid = low + (high - low) // 2

        if ((mid == 0 or x > arr[mid-1]) and arr[mid] == x) :

            return mid

        if (x > arr[mid]) :

            return first(arr, (mid + 1), high, x, n)

        return first(arr, low, (mid -1), x, n)

    return -1

def sortAccording(A1, A2, m, n) :

    temp = [0] * m

    visited = [0] * m

    for i in range(0, m) :

        temp[i] = A1[i]

        visited[i] = 0

    temp.sort()

    ind = 0   

    for i in range(0, n) :

        f = first(temp, 0, m-1, A2[i], m)

        if (f == -1) :

            continue

        j = f

        while (jand temp[j]== A2[i]) :

            A1[ind] = temp[j];

            ind = ind + 1

            visited[j] = 1

            j = j + 1

    for i in range(0, m) :

        if (visited[i] == 0) :

            A1[ind] = temp[i]

            ind = ind + 1

def printArray(arr, n) :

    for i in range(0, n) :

        print(arr[i], end = " ")

    print("")

A1 = [2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8]

A2 = [2, 1, 8, 3]

m = len(A1)

n = len(A2)

print("Sorted array is ")

sortAccording(A1, A2, m, n)

printArray(A1, m)

C#

using System;

class GFG {

    static int first(int[] arr, int low,

                     int high, int x, int n)

    {

        if (high >= low) {

            int mid = low + (high - low) / 2;

            if ((mid == 0 || x > arr[mid - 1]) && arr[mid] == x)

                return mid;

            if (x > arr[mid])

                return first(arr, (mid + 1), high,

                             x, n);

            return first(arr, low, (mid - 1), x, n);

        }

        return -1;

    }

    static void sortAccording(int[] A1, int[] A2,

                              int m, int n)

    {

        int[] temp = new int[m];

        int[] visited = new int[m];

        for (int i = 0; i

            temp[i] = A1[i];

            visited[i] = 0;

        }

        Array.Sort(temp);

        int ind = 0;

        for (int i = 0; i

            int f = first(temp, 0, m - 1, A2[i], m);

            if (f == -1)

                continue;

            for (int j = f; (j

                A1[ind++] = temp[j];

                visited[j] = 1;

            }

        }

        for (int i = 0; i

            if (visited[i] == 0)

                A1[ind++] = temp[i];

    }

    static void printArray(int[] arr, int n)

    {

        for (int i = 0; i

            Console.Write(arr[i] + " ");

        Console.WriteLine();

    }

    public static void Main()

    {

        int[] A1 = { 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 };

        int[] A2 = { 2, 1, 8, 3 };

        int m = A1.Length;

        int n = A2.Length;

        Console.WriteLine("Sorted array is ");

        sortAccording(A1, A2, m, n);

        printArray(A1, m);

    }

}

PHP

function first(&$arr, $low, $high, $x, $n)

{

    if ($high >= $low)

    {

        $mid = intval($low + ($high - $low) / 2);

        if (($mid == 0 || $x > $arr[$mid - 1]) &&

                               $arr[$mid] == $x)

            return $mid;

        if ($x > $arr[$mid])

            return first($arr, ($mid + 1), $high, $x, $n);

        return first($arr, $low, ($mid - 1), $x, $n);

    }

    return -1;

}

function sortAccording(&$A1, &$A2, $m, $n)

{

    $temp = array_fill(0, $m, NULL);

    $visited = array_fill(0, $m, NULL);

    for ($i = 0; $i $m; $i++)

    {

        $temp[$i] = $A1[$i];

        $visited[$i] = 0;

    }

    sort($temp);

    $ind = 0;

    for ($i = 0; $i $n; $i++)

    {

        $f = first($temp, 0, $m - 1, $A2[$i], $m);

        if ($f == -1) continue;

        for ($j = $f; ($j $m &&

             $temp[$j] == $A2[$i]); $j++)

        {

            $A1[$ind++] = $temp[$j];

            $visited[$j] = 1;

        }

    }

    for ($i = 0; $i $m; $i++)

        if ($visited[$i] == 0)

            $A1[$ind++] = $temp[$i];

}

function printArray(&$arr, $n)

{

    for ($i = 0; $i $n; $i++)

        echo $arr[$i] . " ";

    echo "\n";

}

$A1 = array(2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8);

$A2 = array(2, 1, 8, 3);

$m = sizeof($A1);

$n = sizeof($A2);

echo "Sorted array is \n";

sortAccording($A1, $A2, $m, $n);

printArray($A1, $m);

?>

Javascript

    function first(arr,low,high,x,n)

    {

        if (high >= low) {

            let mid = low + Math.floor((high - low) / 2);

            if ((mid == 0 || x > arr[mid - 1]) && arr[mid] == x)

                return mid;

            if (x > arr[mid])

                return first(arr, (mid + 1), high,x, n);

            return first(arr, low, (mid - 1), x, n);

        }

        return -1;

    }

    function sortAccording(A1,A2,m,n)

    {

        let temp=[];

        let visited=[];

        for (let i = 0; i

        {

            temp[i] = A1[i];

            visited[i] = 0;

        }

        temp.sort(function(a, b){return a-b});

        let ind = 0;

        for (let i = 0; i

        {

            let f = first(temp, 0, m - 1, A2[i], m);

            if (f == -1)

            {

                continue;

            }

            for (let j = f; (j

            {

                A1[ind++] = temp[j];

                visited[j] = 1;

            }

        }

        for (let i = 0; i

        {

            if (visited[i] == 0)

                A1[ind++] = temp[i];

        }

    }

    function printArray(arr,n)

    {

        for (let i = 0; i

        {

            document.write(arr[i] + " ");

        }

        document.write("
"
);

    }

    let A1=[2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 ];

    let A2=[2, 1, 8, 3 ];

    let m = A1.length;

    let n = A2.length;

    document.write("Sorted array is
"
);

    sortAccording(A1, A2, m, n);

    printArray(A1, m);

Output

Sorted array is 
2 2 1 1 8 8 3 5 6 7 9 

Time complexity: The steps 1 and 2 require O(m) time. Step 3 requires O(M * Log M) time. Step 5 requires O(N Log M) time. Therefore overall time complexity is O(M Log M + N Log M).

Thanks to vivek for suggesting this method.


Method 2 (Using Self-Balancing Binary Search Tree) 
We can also use a self-balancing BST like AVL Tree, Red Black Tree, etc. Following are detailed steps. 

  • Create a self-balancing BST of all elements in A1[]. In every node of BST, also keep track of count of occurrences of the key and a bool field visited which is initialized as false for all nodes.
  • Initialize the output index ind as 0.
  • Do following for every element of A2[i] in A2[] 
    1. Search for A2[i] in the BST, if present then copy all occurrences to A1[ind] and increment ind. Also mark the copied elements visited in the BST node.
  • Do an inorder traversal of BST and copy all unvisited keys to A1[].

Time Complexity of this method is the same as the previous method. Note that in a self-balancing Binary Search Tree, all operations require logm time.

Method 3 (Use Hashing) 

  • Loop through A1[], store the count of every number in a HashMap (key: number, value: count of number)
  • Loop through A2[], check if it is present in HashMap, if so, put in output array that many times and remove the number from HashMap.
  • Sort the rest of the numbers present in HashMap and put in the output array.

Thanks to Anurag Sigh for suggesting this method. 


Below is the implementation of the above approach:

Python3

from collections import Counter

def solve(arr1, arr2):

    res = []

    f = Counter(arr1)

    for e in arr2:

        res.extend([e]*f[e])

        f[e] = 0

    rem = list(sorted(filter(

      lambda x: f[x] != 0, f.keys())))

    for e in rem:

        res.extend([e]*f[e])

    return res

if __name__ == "__main__":

    arr1 = [2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8]

    arr2 = [2, 1, 8, 3]

    print(*solve(arr1, arr2))

C++

#include

using namespace std;

void sortA1ByA2(int A1[], int N, int A2[], int M, int ans[])

{

    mapint, int> mp;

    int ind = 0;

    for (int i = 0; i

        mp[A1[i]] += 1;

    }

    for (int i = 0; i

        if (mp[A2[i]] != 0) {

            for (int j = 1; j

                ans[ind++] = A2[i];

        }

        mp.erase(A2[i]);

    }

    for (auto it : mp) {

        for (int j = 1; j

            ans[ind++] = it.first;

    }

}

void printArray(int arr[], int n)

{

    for (int i = 0; i

        cout " ";

    cout

}

int main()

{

    int A1[] = { 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 };

    int A2[] = { 2, 1, 8, 3 };

    int n = sizeof(A1) / sizeof(A1[0]);

    int m = sizeof(A2) / sizeof(A2[0]);

    int ans[n];

    sortA1ByA2(A1, n, A2, m, ans);

    cout "Sorted array is \n";

    printArray(ans, n);

    return 0;

}

Output

2 2 1 1 8 8 3 5 6 7 9

Steps 1 and 2 on average take O(m+n) time under the assumption that we have a good hashing function that takes O(1) time for insertion and search on average. The third step takes O(p Log p) time where p is the number of elements remained after considering elements of A2[].

Method 4 (By Writing a Customized Compare Method) 
We can also customize compare method of a sorting algorithm to solve the above problem. For example, qsort() in C allows us to pass our own customized compare method. 



  • If num1 and num2 both are in A2 then the number with a lower index in A2 will be treated smaller than others.
  • If only one of num1 or num2 present in A2, then that number will be treated smaller than the other which doesn’t present in A2.
  • If both are not in A2, then the natural ordering will be taken.

The time complexity of this method is O(mnLogm) if we use a O(nLogn) time complexity sorting algorithm. We can improve time complexity to O(mLogm) by using a Hashing instead of doing linear search.
Below is the implementation of the above approach:

C

#include

#include

int A2[5];

int size = 5;

int search(int key)

{

    int i = 0, idx = 0;

    for (i = 0; i

        if (A2[i] == key)

            return i;

    return -1;

}

int compareByA2(const void* a, const void* b)

{

    int idx1 = search(*(int*)a);

    int idx2 = search(*(int*)b);

    if (idx1 != -1 && idx2 != -1)

        return idx1 - idx2;

    else if (idx1 != -1)

        return -1;

    else if (idx2 != -1)

        return 1;

    else

        return (*(int*)a - *(int*)b);

}

void sortA1ByA2(int A1[], int size1)

{

    qsort(A1, size1, sizeof(int), compareByA2);

}

int main(int argc, char* argv[])

{

    int A1[] = { 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8, 7, 5, 6, 9, 7, 5 };

    A2[0] = 2;

    A2[1] = 1;

    A2[2] = 8;

    A2[3] = 3;

    A2[4] = 4;

    int size1 = sizeof(A1) / sizeof(A1[0]);

    sortA1ByA2(A1, size1);

    printf("Sorted Array is ");

    int i;

    for (i = 0; i

        printf("%d ", A1[i]);

    return 0;

}

C++

#include

using namespace std;

void sortA1ByA2(vectorint> &arr1 , vectorint> &arr2){

    unordered_mapint , int> index;

    for(int i=0; i

        index[arr2[i]] = i+1;

    }

    auto comp = [&](int a , int b){

        if(index[a] == 0  && index[b]==0) return a

        if(index[a] == 0)  return false;

        if(index[b] == 0)   return true;

          return index[a]

        };

    sort(arr1.begin(), arr1.end() , comp);

}

int main(){

       vectorint> arr1{ 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8, 7, 5, 6, 9, 7, 5 };

    vectorint> arr2{2 , 1 , 8 , 3 , 4};

     sortA1ByA2(arr1 , arr2);

     cout"Sorted array is  \n";

       for(auto i: arr1){

            cout" ";

    }

    return 0;

}

Output

Sorted Array is 2 2 1 1 8 8 3 5 5 5 6 6 7 7 7 9 9 

This method is based on comments by readers (Xinuo Chen, Pranay Doshi and javakurious) and compiled by Anurag Singh.
This article is compiled by Piyush. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.


C++

#include

using namespace std;

int first(int arr[], int low, int high, int x, int n)

{

    if (high >= low) {

        int mid = low + (high - low) / 2;

        if ((mid == 0 || x > arr[mid - 1]) && arr[mid] == x)

            return mid;

        if (x > arr[mid])

            return first(arr, (mid + 1), high, x, n);

        return first(arr, low, (mid - 1), x, n);

    }

    return -1;

}

void sortAccording(int A1[], int A2[], int m, int n)

{

    int temp[m], visited[m];

    for (int i = 0; i

        temp[i] = A1[i];

        visited[i] = 0;

    }

    sort(temp, temp + m);

    int ind = 0;

    for (int i = 0; i

        int f = first(temp, 0, m - 1, A2[i], m);

        if (f == -1)

            continue;

        for (int j = f; (j

            A1[ind++] = temp[j];

            visited[j] = 1;

        }

    }

    for (int i = 0; i

        if (visited[i] == 0)

            A1[ind++] = temp[i];

}

void printArray(int arr[], int n)

{

    for (int i = 0; i

        cout " ";

    cout

}

int main()

{

    int A1[] = { 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 };

    int A2[] = { 2, 1, 8, 3 };

    int m = sizeof(A1) / sizeof(A1[0]);

    int n = sizeof(A2) / sizeof(A2[0]);

    cout "Sorted array is \n";

    sortAccording(A1, A2, m, n);

    printArray(A1, m);

    return 0;

}

Java

import java.io.*;

import java.util.Arrays;

class GFG {

    static int first(int arr[], int low, int high,

                     int x, int n)

    {

        if (high >= low) {

            int mid = low + (high - low) / 2;

            if ((mid == 0 || x > arr[mid - 1]) && arr[mid] == x)

                return mid;

            if (x > arr[mid])

                return first(arr, (mid + 1), high,

                             x, n);

            return first(arr, low, (mid - 1), x, n);

        }

        return -1;

    }

    static void sortAccording(int A1[], int A2[], int m,

                              int n)

    {

        int temp[] = new int[m], visited[] = new int[m];

        for (int i = 0; i

            temp[i] = A1[i];

            visited[i] = 0;

        }

        Arrays.sort(temp);

        int ind = 0;

        for (int i = 0; i

            int f = first(temp, 0, m - 1, A2[i], m);

            if (f == -1)

                continue;

            for (int j = f; (j

                 j++) {

                A1[ind++] = temp[j];

                visited[j] = 1;

            }

        }

        for (int i = 0; i

            if (visited[i] == 0)

                A1[ind++] = temp[i];

    }

    static void printArray(int arr[], int n)

    {

        for (int i = 0; i

            System.out.print(arr[i] + " ");

        System.out.println();

    }

    public static void main(String args[])

    {

        int A1[] = { 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 };

        int A2[] = { 2, 1, 8, 3 };

        int m = A1.length;

        int n = A2.length;

        System.out.println("Sorted array is ");

        sortAccording(A1, A2, m, n);

        printArray(A1, m);

    }

}

Python3

def first(arr, low, high, x, n) :

    if (high >= low) :

        mid = low + (high - low) // 2

        if ((mid == 0 or x > arr[mid-1]) and arr[mid] == x) :

            return mid

        if (x > arr[mid]) :

            return first(arr, (mid + 1), high, x, n)

        return first(arr, low, (mid -1), x, n)

    return -1

def sortAccording(A1, A2, m, n) :

    temp = [0] * m

    visited = [0] * m

    for i in range(0, m) :

        temp[i] = A1[i]

        visited[i] = 0

    temp.sort()

    ind = 0   

    for i in range(0, n) :

        f = first(temp, 0, m-1, A2[i], m)

        if (f == -1) :

            continue

        j = f

        while (jand temp[j]== A2[i]) :

            A1[ind] = temp[j];

            ind = ind + 1

            visited[j] = 1

            j = j + 1

    for i in range(0, m) :

        if (visited[i] == 0) :

            A1[ind] = temp[i]

            ind = ind + 1

def printArray(arr, n) :

    for i in range(0, n) :

        print(arr[i], end = " ")

    print("")

A1 = [2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8]

A2 = [2, 1, 8, 3]

m = len(A1)

n = len(A2)

print("Sorted array is ")

sortAccording(A1, A2, m, n)

printArray(A1, m)

C#

using System;

class GFG {

    static int first(int[] arr, int low,

                     int high, int x, int n)

    {

        if (high >= low) {

            int mid = low + (high - low) / 2;

            if ((mid == 0 || x > arr[mid - 1]) && arr[mid] == x)

                return mid;

            if (x > arr[mid])

                return first(arr, (mid + 1), high,

                             x, n);

            return first(arr, low, (mid - 1), x, n);

        }

        return -1;

    }

    static void sortAccording(int[] A1, int[] A2,

                              int m, int n)

    {

        int[] temp = new int[m];

        int[] visited = new int[m];

        for (int i = 0; i

            temp[i] = A1[i];

            visited[i] = 0;

        }

        Array.Sort(temp);

        int ind = 0;

        for (int i = 0; i

            int f = first(temp, 0, m - 1, A2[i], m);

            if (f == -1)

                continue;

            for (int j = f; (j

                A1[ind++] = temp[j];

                visited[j] = 1;

            }

        }

        for (int i = 0; i

            if (visited[i] == 0)

                A1[ind++] = temp[i];

    }

    static void printArray(int[] arr, int n)

    {

        for (int i = 0; i

            Console.Write(arr[i] + " ");

        Console.WriteLine();

    }

    public static void Main()

    {

        int[] A1 = { 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 };

        int[] A2 = { 2, 1, 8, 3 };

        int m = A1.Length;

        int n = A2.Length;

        Console.WriteLine("Sorted array is ");

        sortAccording(A1, A2, m, n);

        printArray(A1, m);

    }

}

PHP

function first(&$arr, $low, $high, $x, $n)

{

    if ($high >= $low)

    {

        $mid = intval($low + ($high - $low) / 2);

        if (($mid == 0 || $x > $arr[$mid - 1]) &&

                               $arr[$mid] == $x)

            return $mid;

        if ($x > $arr[$mid])

            return first($arr, ($mid + 1), $high, $x, $n);

        return first($arr, $low, ($mid - 1), $x, $n);

    }

    return -1;

}

function sortAccording(&$A1, &$A2, $m, $n)

{

    $temp = array_fill(0, $m, NULL);

    $visited = array_fill(0, $m, NULL);

    for ($i = 0; $i $m; $i++)

    {

        $temp[$i] = $A1[$i];

        $visited[$i] = 0;

    }

    sort($temp);

    $ind = 0;

    for ($i = 0; $i $n; $i++)

    {

        $f = first($temp, 0, $m - 1, $A2[$i], $m);

        if ($f == -1) continue;

        for ($j = $f; ($j $m &&

             $temp[$j] == $A2[$i]); $j++)

        {

            $A1[$ind++] = $temp[$j];

            $visited[$j] = 1;

        }

    }

    for ($i = 0; $i $m; $i++)

        if ($visited[$i] == 0)

            $A1[$ind++] = $temp[$i];

}

function printArray(&$arr, $n)

{

    for ($i = 0; $i $n; $i++)

        echo $arr[$i] . " ";

    echo "\n";

}

$A1 = array(2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8);

$A2 = array(2, 1, 8, 3);

$m = sizeof($A1);

$n = sizeof($A2);

echo "Sorted array is \n";

sortAccording($A1, $A2, $m, $n);

printArray($A1, $m);

?>

Javascript

    function first(arr,low,high,x,n)

    {

        if (high >= low) {

            let mid = low + Math.floor((high - low) / 2);

            if ((mid == 0 || x > arr[mid - 1]) && arr[mid] == x)

                return mid;

            if (x > arr[mid])

                return first(arr, (mid + 1), high,x, n);

            return first(arr, low, (mid - 1), x, n);

        }

        return -1;

    }

    function sortAccording(A1,A2,m,n)

    {

        let temp=[];

        let visited=[];

        for (let i = 0; i

        {

            temp[i] = A1[i];

            visited[i] = 0;

        }

        temp.sort(function(a, b){return a-b});

        let ind = 0;

        for (let i = 0; i

        {

            let f = first(temp, 0, m - 1, A2[i], m);

            if (f == -1)

            {

                continue;

            }

            for (let j = f; (j

            {

                A1[ind++] = temp[j];

                visited[j] = 1;

            }

        }

        for (let i = 0; i

        {

            if (visited[i] == 0)

                A1[ind++] = temp[i];

        }

    }

    function printArray(arr,n)

    {

        for (let i = 0; i

        {

            document.write(arr[i] + " ");

        }

        document.write("
"
);

    }

    let A1=[2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 ];

    let A2=[2, 1, 8, 3 ];

    let m = A1.length;

    let n = A2.length;

    document.write("Sorted array is
"
);

    sortAccording(A1, A2, m, n);

    printArray(A1, m);

Python3

from collections import Counter

def solve(arr1, arr2):

    res = []

    f = Counter(arr1)

    for e in arr2:

        res.extend([e]*f[e])

        f[e] = 0

    rem = list(sorted(filter(

      lambda x: f[x] != 0, f.keys())))

    for e in rem:

        res.extend([e]*f[e])

    return res

if __name__ == "__main__":

    arr1 = [2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8]

    arr2 = [2, 1, 8, 3]

    print(*solve(arr1, arr2))

C++

#include

using namespace std;

void sortA1ByA2(int A1[], int N, int A2[], int M, int ans[])

{

    mapint, int> mp;

    int ind = 0;

    for (int i = 0; i

        mp[A1[i]] += 1;

    }

    for (int i = 0; i

        if (mp[A2[i]] != 0) {

            for (int j = 1; j

                ans[ind++] = A2[i];

        }

        mp.erase(A2[i]);

    }

    for (auto it : mp) {

        for (int j = 1; j

            ans[ind++] = it.first;

    }

}

void printArray(int arr[], int n)

{

    for (int i = 0; i

        cout " ";

    cout

}

int main()

{

    int A1[] = { 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 };

    int A2[] = { 2, 1, 8, 3 };

    int n = sizeof(A1) / sizeof(A1[0]);

    int m = sizeof(A2) / sizeof(A2[0]);

    int ans[n];

    sortA1ByA2(A1, n, A2, m, ans);

    cout "Sorted array is \n";

    printArray(ans, n);

    return 0;

}

C

#include

#include

int A2[5];

int size = 5;

int search(int key)

{

    int i = 0, idx = 0;

    for (i = 0; i

        if (A2[i] == key)

            return i;

    return -1;

}

int compareByA2(const void* a, const void* b)

{

    int idx1 = search(*(int*)a);

    int idx2 = search(*(int*)b);

    if (idx1 != -1 && idx2 != -1)

        return idx1 - idx2;

    else if (idx1 != -1)

        return -1;

    else if (idx2 != -1)

        return 1;

    else

        return (*(int*)a - *(int*)b);

}

void sortA1ByA2(int A1[], int size1)

{

    qsort(A1, size1, sizeof(int), compareByA2);

}

int main(int argc, char* argv[])

{

    int A1[] = { 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8, 7, 5, 6, 9, 7, 5 };

    A2[0] = 2;

    A2[1] = 1;

    A2[2] = 8;

    A2[3] = 3;

    A2[4] = 4;

    int size1 = sizeof(A1) / sizeof(A1[0]);

    sortA1ByA2(A1, size1);

    printf("Sorted Array is ");

    int i;

    for (i = 0; i

        printf("%d ", A1[i]);

    return 0;

}

C++

#include

using namespace std;

void mergeArrays(int arr1[], int arr2[], int n1,

                             int n2, int arr3[])

{

    int i = 0, j = 0, k = 0;

    while (i

    {

        if (arr1[i]

            arr3[k++] = arr1[i++];

        else

            arr3[k++] = arr2[j++];

    }

    while (i

        arr3[k++] = arr1[i++];

    while (j

        arr3[k++] = arr2[j++];

}

int main()

{

    int arr1[] = {1, 3, 5, 7};

    int n1 = sizeof(arr1) / sizeof(arr1[0]);

    int arr2[] = {2, 4, 6, 8};

    int n2 = sizeof(arr2) / sizeof(arr2[0]);

    int arr3[n1+n2];

    mergeArrays(arr1, arr2, n1, n2, arr3);

    cout "Array after merging"

    for (int i=0; i

        cout " ";

    return 0;

}

Java

import java.util.*;

import java.lang.*;

import java.io.*;

class MergeTwoSorted

{

    public static void mergeArrays(int[] arr1, int[] arr2, int n1,

                                int n2, int[] arr3)

    {

        int i = 0, j = 0, k = 0;

        while (i

        {

            if (arr1[i]

                arr3[k++] = arr1[i++];

            else

                arr3[k++] = arr2[j++];

        }

        while (i

            arr3[k++] = arr1[i++];

        while (j

            arr3[k++] = arr2[j++];

    }

    public static void main (String[] args)

    {

        int[] arr1 = {1, 3, 5, 7};

        int n1 = arr1.length;

        int[] arr2 = {2, 4, 6, 8};

        int n2 = arr2.length;

        int[] arr3 = new int[n1+n2];

        mergeArrays(arr1, arr2, n1, n2, arr3);

        System.out.println("Array after merging");

        for (int i=0; i

            System.out.print(arr3[i] + " ");

    }

}

Python 3

def mergeArrays(arr1, arr2, n1, n2):

    arr3 = [None] * (n1 + n2)

    i = 0

    j = 0

    k = 0

    while i and j

        if arr1[i]

            arr3[k] = arr1[i]

            k = k + 1

            i = i + 1

        else:

            arr3[k] = arr2[j]

            k = k + 1

            j = j + 1

    while i

        arr3[k] = arr1[i];

        k = k + 1

        i = i + 1

    while j

        arr3[k] = arr2[j];

        k = k + 1

        j = j + 1

    print("Array after merging")

    for i in range(n1 + n2):

        print(str(arr3[i]), end = " ")

arr1 = [1, 3, 5, 7]

n1 = len(arr1)

arr2 = [2, 4, 6, 8]

n2 = len(arr2)

mergeArrays(arr1, arr2, n1, n2);

C#

using System;

class GFG

{

    public static void mergeArrays(int[] arr1, int[] arr2,

                                   int n1, int n2, int[] arr3)

    {

        int i = 0, j = 0, k = 0;

        while (i

        {

            if (arr1[i]

                arr3[k++] = arr1[i++];

            else

                arr3[k++] = arr2[j++];

        }

        while (i

            arr3[k++] = arr1[i++];

        while (j

            arr3[k++] = arr2[j++];

    }

    public static void Main()

    {

        int[] arr1 = {1, 3, 5, 7};

        int n1 = arr1.Length;

        int[] arr2 = {2, 4, 6, 8};

        int n2 = arr2.Length;

        int[] arr3 = new int[n1+n2];

        mergeArrays(arr1, arr2, n1, n2, arr3);

        Console.Write("Array after merging\n");

        for (int i = 0; i

            Console.Write(arr3[i] + " ");

    }

}

PHP

function mergeArrays(&$arr1, &$arr2,

                      $n1, $n2, &$arr3)

{

    $i = 0;

    $j = 0;

    $k = 0;

    while ($i $n1 && $j $n2)

    {

        if ($arr1[$i] $arr2[$j])

            $arr3[$k++] = $arr1[$i++];

        else

            $arr3[$k++] = $arr2[$j++];

    }

    while ($i $n1)

        $arr3[$k++] = $arr1[$i++];

    while ($j $n2)

        $arr3[$k++] = $arr2[$j++];

}

$arr1 = array(1, 3, 5, 7);

$n1 = sizeof($arr1);

$arr2 = array(2, 4, 6, 8);

$n2 = sizeof($arr2);

$arr3[$n1 + $n2] = array();

mergeArrays($arr1, $arr2, $n1,

                   $n2, $arr3);

echo "Array after merging \n" ;

for ($i = 0; $i $n1 + $n2; $i++)

    echo $arr3[$i] . " ";

?>

CPP

#include

using namespace std;

void mergeArrays(int a[], int b[], int n, int m)

{

    mapint, bool> mp;

    for(int i = 0; i

    mp[a[i]] = true;

    for(int i = 0;i

    mp[b[i]] = true;

    for(auto i: mp)

    cout" ";

}

int main()

{

    int a[] = {1, 3, 5, 7}, b[] = {2, 4, 6, 8};

    int size = sizeof(a)/sizeof(int);

    int size1 = sizeof(b)/sizeof(int);

    mergeArrays(a, b, size, size1);

    return 0;

}

Цикл each (jQuery.each). Примеры использования

Синтаксис функции each:

// array или object - массив или объект, элементы или свойства которого необходимо перебрать
// callback - функция, которая будет выполнена для каждого элемента массива или свойства объекта
$.each(array или object,callback);

Работу с функцией each разберём на примерах.

Пример №1. В нём выполним переберор всех элементов массива (array).

// массив, состоящий из 3 строк
var arr = ['Автомобиль','Грузовик','Автобус'];

// переберём массив arr
$.each(arr,function(index,value){

  // действия, которые будут выполняться для каждого элемента массива
  // index - это текущий индекс элемента массива (число)
  // value - это значение текущего элемента массива
  
  //выведем индекс и значение массива в консоль
  console.log('Индекс: ' + index + '; Значение: ' + value);

});

/*
Результат (в консоли):
Индекс: 0; Значение: Автомобиль
Индекс: 1; Значение: Грузовик
Индекс: 2; Значение: Автобус
*/

В вышеприведённом коде функция each используется для перебора массива. Функция имеет 2 обязательных параметра. Первый параметр - это сущность (массив или объект), элементы (свойства) которой необходимо перебрать. В данном случае - это массив arr. Второй параметр - это функция обратного вызова, которая будет выполнена для каждого элемента (в данном случае) массива. Она имеет 2 параметра, которые доступны внутри неё посредством соответствующих переменных. Первый параметр - это порядковый номер элемента (отсчёт выполняется с 0). Второй параметр - это значение текущего элемента массива.

Пример №2. В этом примере осуществим перебор всех свойств объекта.

// объект smartphone, имеющий 5 свойств
var smartphone = {
  "name": "LG G5 se",
  "year": "2016",
  "screen-size": "5.3",
  "screen-resolution": "2560 x 1440",
  "os" : "Android 6.0 (Marshmallow)"
};

// переберём объект smartphone
$.each(smartphone, function( key, value ) {

  // действия, которые будут выполняться для каждого свойства объекта
  // key - текущее имя свойства массива
  // value - значение текущего свойства объекта
 
  // выведем имя свойства и его значение в консоль
  console.log( 'Свойство: ' +key + '; Значение: ' + value );

});

/*
Результат (в консоли):
Свойство: name; Значение: LG G5 se
Свойство: year; Значение: 2016
Свойство: screen-size; Значение: 5.3
Свойство: screen-resolution; Значение: 2560 x 1440
Свойство: os; Значение: Android 6.0 (Marshmallow)
*/

Функция each может использоваться для перебора JavaScript объектов. Отличие её использования заключается только в том, что параметры функции обратного вызова имеют другие значения. Первый параметр хранит название свойства объекта, а второй - значение этого свойства.

Пример №3. В нём осуществим перебор более сложной структуры (рассмотрим, как использовать вложенные each).

// объект, состоящий из 2 свойств. Каждое свойство этого объект имеет в качестве значения массив, элементами которого являются тоже объекты
var articles = {
  "Bootstrap": [
    {"id":"1", "title":"Введение"},
    {"id":"2", "title":"Как установить"},
    {"id":"3", "title":"Сетка"}
  ],
  "JavaScript": [
    {"id":"4", "title":"Основы"},
    {"id":"5", "title":"Выборка элементов"}
  ]  
};

$.each(articles,function(key,data) {
  console.log('Раздел: ' + key);
  $.each(data, function(index,value) {
    console.log('Статья: id = ' + value['id'] + '; Название = '+ value['title']);
  });
});

/*
Результат:
Раздел: Bootstrap
Статья: id = 1; Название = Введение
Статья: id = 2; Название = Как установить
Статья: id = 3; Название = Сетка
Раздел: JavaScript
Статья: id = 4; Название = Основы
Статья: id = 5; Название = Выборка элементов
*/

Как прервать each (выйти из цикла)

Прерывание (break) цикла each осуществляется с помощью оператора return, который должен возвращать значение false.

Например, прервём выполнение цикла each после того как найдём в массиве arr число 7:

// массив, состоящий из 5 чисел
var arr = [5, 4, 7, 17, 19];

// число, которое необходимо найти
var find = 7;

// переберём массив arr
$.each(arr, function (index, value) {
  // если необходимое число найдено, то..
  if (value === find) {
    // вывести его в консоль
    console.log('Ура! Число ' + find + ' найдено! Данное число имеет индекс: ' + index);
    // прервать выполнение цикла
    return false;
  } else {
  // иначе вывести в консоль текущее число
  console.log('Текущее число: ' + value);
  }
});

/* Результат (в консоли):
Текущее число: 5
Текущее число: 4
Ура! Число 7 найдено! Данное число имеет индекс: 2
*/

Как перейти к следующей итерации (each continue)

В each прерывание выполнения текущей итерации и переход к следующей осуществляется с помощью оператора return, который должен иметь значение отличное от false.

// массив, состоящий из чисел
var arr = [3, 5, 4, 9, 17, 19, 30, 35, 40];

// массив, который должен содержать все элементы массива arr, кроме чётных чисел
var newarr = [];

// переберём массив arr
$.each(arr, function (index, value) {

  // если элемент чётный, то пропустим его
  if (value % 2 === 0) {
    // прервём выполнение текущей итерации и перейдём к следующей
    return;
  }
  // добавить в массив newarr значение value
  newarr.push(value);

});

console.log('Исходный массив (arr): ' + arr.join());
console.log('Результирующий массив (newarr): ' + newarr.join());

/* Результат (в консоли):
Исходный массив (arr): 3,5,4,9,17,19,30,35,40
Результирующий массив (newarr): 3,5,9,17,19,35
*/