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 ạ.
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
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);
#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
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
bác giải thích hộ với, trước giờ vẫn hay khai báo thế
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.