khoahoc.vietjack.com
Xin chào! Vào học

Câu hỏi:

03/07/2023 465 Lưu

Hội diễn văn nghệ của trường năm nay, lớp Thanh An tham gia biểu diễn khiêu vũ tập thể theo cặp (nam, nữ). Thầy giáo chủ nhiệm chọn ra n bạn nam có chiều cao A0, A1,...An-1, đứng thành một hàng ngang và n bạn nữ có chiều cao B0, B1,...Bn-1 đứng thành một hàng ngang để ghép thành nở cặp (nam. nữ). Để tiện ghép cặp, thầy giáo sắp xếp lại vị trí đứng các bạn nam trong hàng theo thứ tự chiều cao tăng dần và vị trí đứng các bạn nữ trong hàng cũng theo thứ tự chiều cao tăng dần. Sau đó thầy giáo tiến hành ghép cặp bạn nam thấp nhất với bạn nữ thấp nhất, bạn nam thấp thứ hai với bạn nữ thấp thứ hai và cứ như vậy đến bạn nam cao nhất với bạn nữ cao nhất. Em hãy viết chương trình áp dựng thuật toán sắp xếp trộn đề giúp thầy giáo thực hiện công việc ghép cặp này.

Chương trình cần nhập vào một số nguyên n, tiếp theo nhập vào n giá trị A0, A1, An-1 và n giá trị B0, B1, Bn-1 Chương trình cần in ra n cặp số Ai, Bj (0<i, j <n-1) là cách xếp cặp (nam, nữ) theo mong muốn của thầy giáo ở trên.

Quảng cáo

Trả lời:

verified Giải bởi Vietjack

// Code from https://nguyenvanhieu.vn

#include<stdlib.h>

#include<stdio.h>

// Gộp hai mảng con arr[l...m] và arr[m+1..r]

void merge(int arr[], int l, int m, int r)

{

    int i, j, k;

    int n1 = m - l + 1;

    int n2 =  r - m;

 

    /* Tạo các mảng tạm */

    int L[n1], R[n2];

    /* Copy dữ liệu sang các mảng tạm */

    for (i = 0; i < n1; i++)

        L[i] = arr[l + i];

    for (j = 0; j < n2; j++)

        R[j] = arr[m + 1+ j];

    /* Gộp hai mảng tạm vừa rồi vào mảng arr*/

    i = 0; // Khởi tạo chỉ số bắt đầu của mảng con đầu tiên

    j = 0; // Khởi tạo chỉ số bắt đầu của mảng con thứ hai

    k = l; // IKhởi tạo chỉ số bắt đầu của mảng lưu kết quả

    while (i < n1 && j < n2)

    {

        if (L[i] <= R[j])

        {

            arr[k] = L[i];

            i++;

        }

        else

        {

            arr[k] = R[j];

            j++;

        }

        k++;

    }

    /* Copy các phần tử còn lại của mảng L vào arr nếu có */

    while (i < n1)

    {

        arr[k] = L[i];

        i++;

        k++;

    }

    /* Copy các phần tử còn lại của mảng R vào arr nếu có */

    while (j < n2)

    {

        arr[k] = R[j];

        j++;

        k++;

    }

} 

/* l là chỉ số trái và r là chỉ số phải của mảng cần được sắp xếp */

void mergeSort(int arr[], int l, int r)

{

    if (l < r)

    {

        // Tương tự (l+r)/2, nhưng cách này tránh tràn số khi l và r lớn

        int m = l+(r-l)/2;

        // Gọi hàm đệ quy tiếp tục chia đôi từng nửa mảng

        mergeSort(arr, l, m);

        mergeSort(arr, m+1, r);

 

        merge(arr, l, m, r);

    }

}

/* Hàm xuất mảng */

void printArray(int A[], int size)

{

    int i;

    for (i=0; i < size; i++)

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

    printf("\n");

}

int main()

{

    int arr[] = {12, 11, 13, 5, 6, 7};

    int arr_size = sizeof(arr)/sizeof(arr[0]);

    printf("Given array is \n");

    printArray(arr, arr_size);

    mergeSort(arr, 0, arr_size - 1);

    printf("\nSorted array is \n");

    printArray(arr, arr_size);

    return 0;

}// Code from https://nguyenvanhieu.vn

 

#include<stdlib.h>

#include<stdio.h>

// Gộp hai mảng con arr[l...m] và arr[m+1..r]

void merge(int arr[], int l, int m, int r)

{

    int i, j, k;

    int n1 = m - l + 1;

    int n2 =  r - m;

    /* Tạo các mảng tạm */

    int L[n1], R[n2];

    /* Copy dữ liệu sang các mảng tạm */

    for (i = 0; i < n1; i++)

        L[i] = arr[l + i];

    for (j = 0; j < n2; j++)

        R[j] = arr[m + 1+ j];

    /* Gộp hai mảng tạm vừa rồi vào mảng arr*/

    i = 0; // Khởi tạo chỉ số bắt đầu của mảng con đầu tiên

    j = 0; // Khởi tạo chỉ số bắt đầu của mảng con thứ hai

    k = l; // IKhởi tạo chỉ số bắt đầu của mảng lưu kết quả

    while (i < n1 && j < n2)

    {

        if (L[i] <= R[j])

        {

            arr[k] = L[i];

            i++;

        }

        else

        {

            arr[k] = R[j];

            j++;

        }

        k++;

    }

    /* Copy các phần tử còn lại của mảng L vào arr nếu có */

    while (i < n1)

    {

        arr[k] = L[i];

        i++;

        k++;

    }

    /* Copy các phần tử còn lại của mảng R vào arr nếu có */

    while (j < n2)

    {

        arr[k] = R[j];

        j++;

        k++;

    }

}

/* l là chỉ số trái và r là chỉ số phải của mảng cần được sắp xếp */

void mergeSort(int arr[], int l, int r)

{

    if (l < r)

    {

        // Tương tự (l+r)/2, nhưng cách này tránh tràn số khi l và r lớn

        int m = l+(r-l)/2;

        // Gọi hàm đệ quy tiếp tục chia đôi từng nửa mảng

        mergeSort(arr, l, m);

        mergeSort(arr, m+1, r);

 

        merge(arr, l, m, r);

    }

}

 

/* Hàm xuất mảng */

void printArray(int A[], int size)

{

    int i;

    for (i=0; i < size; i++)

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

    printf("\n");

}

int main()

{

    int arr[] = {12, 11, 13, 5, 6, 7};

    int arr_size = sizeof(arr)/sizeof(arr[0]);

    printf("Given array is \n");

    printArray(arr, arr_size);

    mergeSort(arr, 0, arr_size - 1);

    printf("\nSorted array is \n");

    printArray(arr, arr_size);

    return 0;

}

Đang tải chế độ Học...

Dành cho bạn Hot

Lớp 11 Vật lý
197 người thi tuần này

Trắc nghiệm Mô tả sóng lớp 11 (có đáp án)

10 câu 6.3 K lượt thi Thi ngay →
Lớp 11 Hóa học
348 người thi tuần này

Trắc nghiệm Khái niệm về cân bằng hoá học lớp 11 (có đáp án - phần 1)

15 câu 10.2 K lượt thi Thi ngay →
Lớp 11 Tiếng Anh
142 người thi tuần này

Đề cương ôn tập giữa kì 1 Tiếng Anh 11 Global Success có đáp án

50 câu 1.2 K lượt thi Thi ngay →
Lớp 11 Sinh học
154 người thi tuần này

15 câu Trắc nghiệm Sinh học 11 Kết nối tri thức Bài 8 có đáp án

15 câu 3.2 K lượt thi Thi ngay →
Lớp 11 Lịch sử
1,460 người thi tuần này

25 câu Trắc nghiệm Lịch Sử 11 Kết nối tri thức Bài 1 có đáp án

25 câu 20.4 K lượt thi Thi ngay →
Lớp 11 Tin học
849 người thi tuần này

15 câu Trắc nghiệm Tin học 11 Kết nối tri thức Bài 1 có đáp án

15 câu 9.8 K lượt thi Thi ngay →
Lớp 11 Giáo dục Kinh tế và Pháp luật
166 người thi tuần này

16 câu Trắc nghiệm Kinh tế pháp luật 11 Kết nối tri thức Bài 2 có đáp án

16 câu 3.9 K lượt thi Thi ngay →

CÂU HỎI HOT CÙNG CHỦ ĐỀ

Lời giải

Giai đoạn I: Ở giai đoạn này. với mỗi lượt, mỗi dãy được chia làm hai dây nhỏ với mục tiêu sắp xếp tăng dần trên từng dãy nhỏ hình 1). Quá trình kết thúc khi mỗi

Lượt 1:  Chia thành hai dãy, một dãy 2 bạn (Thi, An) và một dãy 3 bạn (Hoa, Lâm, Mai).

Lượt 2: Chia mỗi đây trong hai dây trên thành hai dãy nhỏ. lần hượt lá: (Thi), (An) (Hoa) và (Lâm, Mai).

Lượt 3: Chia dãy (Lâm, Mai) thành hai đây mỗi dãy có đúng một bạn: (Lâm), (Mai)

Lời giải

Các thuật toán sắp xếp đơn giản như Bubble Sort, Insertion Sort . . . đều không thể xử lý được dữ liệu lớn. Thuật toán sắp xếp trộn lấy ý tưởng từ việc chia để trị để chia nhỏ bài toán thành các bài toán nhỏ hơn, sau đó giải quyết chúng. Từ đó sẽ giúp xử lý dữ liệu lớn một cách tốt hơn, tối ưu về mặt thời gian.

Ý tưởng đưa ra như sau:

Chia danh sách gồm n phần tử chưa được sắp xếp thành n danh sách con, mỗi danh sách chứa một phần tử (danh sách một phần tử được coi là đã sắp xếp).

Liên tục hợp nhất các danh sách con để tạo ra các danh sách con được sắp xếp mớ cho đến khi chỉ còn lại một danh sách. Đây sẽ là danh sách được sắp xếp.

Ví dụ:

void Swap(int &a, int &b){

    int temp = a;

    a = b;

    b = temp;

}

void InterchangeSort(int a[], int n){       

    for (int i = 0; i < n - 1; i++)

        for (int j = i + 1; j < n; j++)

                     if(a[i] > a[j]) //nếu có nghịch thế thì đổi chỗ

                                  Swap(a[i], a[j]);