Bài tập phần mảng c++

Cho mảng một chiều gồm n phần tử nguyên, sắp xếp lại mảng sao cho nhưng phần tử âm thì tăng dần còn các phần tử dương thì giảm dần.Ví dụ: -20 -16 -2 18 7 15 1. In kết quả ra màn hình.

ai hướng giúp e giải thuật của bài này với ạ.

Chia mảng thành hai phần (đi từ hai đầu) rồi làm j thì làm :smiley:

4 Likes

Viết lại hàm compare

int compare(int a, int b)
{
    if (a > 0 && b > 0) return a > b;
    return a < b;
}

Sau đó bỏ vào sort (insertion sort, selection sort, merge sort, …). Chỗ nào có so sánh < thì đổi thành compare.

void selection_sort(int* arr, int n, int (* compare)(int, int))
{
    int i, j, min_index, temp;
    for (i = 0; i < n-1; i++)
    {
        min_index = i;
        for (j = i+1; j < n; j++)
            if (compare(a[j], a[min_index])) // đổi a<b thành compare(a,b)
                min_index = j;
        if (min_index != i)
        {
            temp = a[j];
            a[j] = a[min_index];
            a[min_index] = temp;
        }
    }
}

Cuối cùng gọi

int numbers[] = { -20; 1; 15; -2; -16; 18; 7 };
int len = 7;

selection_sort(numbers, len, compare);
4 Likes
#include <iostream>
using namespace std;
int main()
{
    int n; cin >> n;
    int a[n]; 
    for(int i=0; i<n; ++i) cin >> a[i];
    
    for(int i=0; i<n-1; ++i) 
    {
        for(int j=i+1; j<n;++j)
        {
            if(a[i]<0 && a[j]<0 && a[i]<a[j]) 
            swap(a[i], a[j]);
            if(a[i]>0 && a[j]>0 && a[i]>a[j]) 
            swap(a[i], a[j]);
        }
    }
    
    for(int i=0; i<n; ++i) 
        cout << a[i] << " ";
    
}
// hoặc cách này không đẹp lắm :v
2 Likes

e cảm ơn bác ạ. bài code chi tiết lắm ạ

int a[n]; Trong C++ ko có khai báo kiểu này nha, chỉ có ở trong C :V

3 Likes

bác giải thích hộ với, trước giờ vẫn hay khai báo thế :frowning:

code của bác hình như không sắp xếp đc A[0] thì phải, em run nó mặc định a[0] nằm ở giữa

theo như bạn nói ở đề bài thì giữ nguyên các vị trí âm dương, code mình theo như vậy. còn nếu âm 1 phía dương 1 phía thì khác

Thớt chỉ mới ghi ra mỗi cái input thôi.

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