Có cách nào để sort mảng a theo mảng b mà dùng thư viện có sẵn không?

Cho em hỏi có cách nào để sort mảng a theo mảng b mà dùng thư viện có sẵn được không ạ?
Ví dụ cho mảng A: 1 2 3 4 5 và mảng B: 2 3 4 8 7 thì sau khi sort:
B: 2 3 4 7 8
A: 1 2 3 5 4 …
Giải pháp của em là tự viết hàm quicksort rồi chỗ swap(b[i], b[j]) thì kèm thêm swap(a[i], a[j]).
Nhưng em viết như thế này thì lại sai:

sort(a.begin(), a.end(), [](const int &A, const int &B){return b[A]<b[B];});

Giải thích giúp em với ạ.

Thiếu type nó ko chạy đâu bạn :smiley:
Mà kèo này ko ổn vì std::sort có truyền index đâu, custom thôi.

4 Likes

Thiếu type rồi, phải là

[](const int &A, const int &B)

Mà chỉ đúng khi A = {1, 2,…,N} thôi.

3 Likes

em hỏi cái này là vì cái bài kị sĩ hôm qua ấy a
tại ban đầu em sort mảng sức mạnh nên phải sort mảng tiền với 1 mảng c đánh dấu theo mảng đó… rồi sau đó em lại sort về như cũ nhờ mảng c
nên e viết tận 2 cái hàm quicksort rồi trong swap e cứ swap cái gì cần thiết…mà như vậy nó dài quá…ko biết làm sao để sort rồi sau đó tìm đúng vị trí lại như cũ
à trong trường hợp này e có nghĩ đến struct

struct point{ int x, y;};
point a[n];
sort(a, a+n, [](const point& a, const point& b){return a.x < b.x};

thì chạy ok nhưng ở đây e muốn đưa về vị trí cũ mà trong struct cho thêm 1 biến z nữa thì hàm sort báo lỗi :3

vâng nãy mình đăng lên gõ thiếu type :3 nhưng mình thêm type zô thì cũng k ổn :v
mình đang gặp vấn đề ở chỗ sort 1 mảng rồi sort lại như cũ để lấy vị trí …bạn cho mình giải pháp được ko :3

Thêm & vô cái lambda kia là được: [&](....

4 Likes

nhưng vẫn ko ra kết quả đúng như ý e muốn :((

vậy chắc thiếu ở chỗ swap bên a nó ko swap bên b :V

em có thể tạo 1 mảng c mới với mỗi phần tử là c[i] = (a[i], b[i]) :V

std::vector<std::pair<int, int>> c;
std::transform(begin(a), end(a), begin(b), std::back_inserter(c), [](int x, int y) { return std::make_pair(x, y); });

rồi sort mảng c này :V :V

std::sort(begin(c), end(c), [](auto const& x, auto const& y) { return x.second < y.second; });

rồi quẳng nó vào a, b lại :V :V :V

std::transform(begin(c), end(c), begin(a), [](auto const& x) { return x.first; });
std::transform(begin(c), end(c), begin(b), [](auto const& x) { return x.second; });
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> a = {1, 2, 3, 4, 5};
    std::vector<int> b = {2, 3, 4, 8, 7};

    std::vector<std::pair<int, int>> c;
    std::transform(begin(a), end(a), begin(b), std::back_inserter(c),
                   [](int x, int y) { return std::make_pair(x, y); });

    std::sort(begin(c), end(c),
              [](auto const& x, auto const& y) { return x.second < y.second; });

    std::transform(begin(c), end(c), begin(a),
                   [](auto const& x) { return x.first; });
    std::transform(begin(c), end(c), begin(b),
                   [](auto const& x) { return x.second; });

    for (int x : b) std::cout << x << " ";
    std::cout << "\n";
    for (int x : a) std::cout << x << " ";
    std::cout << "\n";
}
4 Likes

cách trên copy ra mảng c mới là dỏm :V Cách xịn là tạo 1 mảng indices rồi sort indices đó thôi :V (sau đó truy cập mảng a, b theo indices này)

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> a = {1, 2, 3, 4, 5};
    std::vector<int> b = {2, 3, 4, 8, 7};
    
    std::vector<size_t> id(a.size());
    std::iota(begin(id), end(id), 0);
    std::sort(begin(id), end(id), [&](auto i, auto j) { return b[i] < b[j]; });

    for (int i : id) std::cout << b[i] << " ";
    std::cout << "\n";
    for (int i : id) std::cout << a[i] << " ";
    std::cout << "\n";
}

mà hình như đây là cách đầu của em mà :V a chắc là mảng id ở đây. Chỉ thiếu chỗ truy cập b theo id thôi :V thay vì b[i] thì xài b[a[i]] :V

4 Likes

em hiểu rồi ạ, cám ơn a

bạn có thể dùng struct
kiểu
struct hh
{

}

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?