Перестановка пары массивов относительно отсортированного третьего массива, сделанного из предыдущих двух - PullRequest
0 голосов
/ 09 октября 2018

Предположим, у меня есть 3 массива.

arr1 = {96, 100, 104, 108}

arr2 = {8, 4, 4, 16}

Теперь я создаю третий массив, в котором я буду хранить элементы = arr1[i]/arr2[i]

Поэтому arr3 = {12, 25, 26, 9}

Теперь, что я хочу сделать, это сортировка arr3.Но также сортируйте arr1 и arr2 в том же порядке.

Как и сейчас arr3 = {9, 12, 25, 26} Я также хочу отсортировать arr1 и arr2 по одному и тому же порядку, что означает.

arr1 = {108, 96, 100, 104} arr2 = {16, 8, 4, 4}

Так же как и для arr3[2] = 26 Я могу напечатать / использовать arr1[2] = 96 && arr2[2] = 8.

По сути, я хочу иметь доступ к элементу arr1 и arr2 через arr3.Если есть другие способы сделать это (возможно, лучше), ответьте.

Спасибо заранее.

Ответы [ 4 ]

0 голосов
/ 09 октября 2018

Не сортировать массив, сортировать индексы

#include <stdio.h>
#include <stdlib.h>

int arr1[] = {96, 100, 104, 108};
int arr2[] = {8, 4, 4, 16};
int arr3[] = {12, 25, 26, 9};

int delta(const void *a, const void *b) {
    const int *aa = a;
    const int *bb = b;
    return arr3[*aa] - arr3[*bb];
}

int main(void) {
    int indexes[] = {0, 1, 2, 3};
    qsort(indexes, 4, sizeof (int), delta);

    printf("arr1:");
    for (int k = 0; k < 4; k++) {
        printf(" %d", arr1[indexes[k]]);
    }
    printf("\narr2:");
    for (int k = 0; k < 4; k++) {
        printf(" %d", arr2[indexes[k]]);
    }
    printf("\n");
}

Извините за глобальные переменные.

0 голосов
/ 09 октября 2018
#include <iostream>
#include<bits/stdc++.h>
using namespace std;

// created a structure containing three elements
struct node
{
    int a;
    int b;
    int c;
} arr[3];

// comparator function which is used to sort structure based on its one property 'c' value
bool compareTwoStudents(node aa, node bb) 
{ 
    return (aa.c < bb.c); 
} 

int main() {

    arr[0].a=96;
    arr[1].a=100;
    arr[2].a=108;

    arr[0].b=8;
    arr[1].b=4;
    arr[2].b=16;

    arr[0].c=12;
    arr[1].c=25;
    arr[2].c=9;

    // sort function of c++, takes third arguement as the custom comparator function
    sort(arr, arr+3, compareTwoStudents); 

    for(int i=0;i<3;i++)
    {
        cout<<arr[i].a<<" "<<arr[i].b<<" "<<arr[i].c<<"\n";
    }


    return 0;
}
0 голосов
/ 09 октября 2018

Сначала вы определяете структуру данных для хранения значений:

typedef struct {
    int dividend, divisor, result;
} intTuple;

Затем вы определяете функцию сортировки для C * qsort

int compare(const intTuple *e1, const intTuple *e2){
    return (e1->result > e2->result)? 1 : 0;
}

Затем вы инициализируете данные, выполняетеделение и назовите qsort:

int main() {
    intTuple tuples[4] = { {96, 8}, {100, 4}, {104, 8}, {108, 16} };
    for (int i = 0; i < 4; i++) {
        tuples[i].result = tuples[i].dividend / tuples[i].divisor;
    }
    qsort(tuples, 4, sizeof(intTuple), compare);
    for (int i = 0; i < 4; i++) {
        printf("%d ", tuples[i].dividend);
    }
}

Проверьте это здесь .

0 голосов
/ 09 октября 2018

Большинство (если не все?) Сортировки будут использовать обмен элементов.Когда вы сортируете arr3 и меняете его элементы, просто поменяйте местами соответствующие элементы других массивов.

Таким образом, когда вы меняете, например, arr3[i] на arr3[j], то также меняете arr1[i] наarr1[j] и arr2[i] с arr2[j].

...