Hiển thị kết quả từ 1 đến 6 / 6
-
04-01-2012 00:04 #1
Registered User
- Tham gia
- 27-12-2011
- Bài viết
- 14
- Like
- 5
- Thanked 0 Times in 0 Posts
bài tập c sắp xếp số dương tăng dần và số âm giảm dần trong mảng 1 chiều
mình giải như sau.
nhưng mình có 1 chút băn khoăn là thế này: giả sử như mảng như sau : -5 6 -4 1. thì nếu sử dụng code trên thì đáng lẽ kết quả sẽ là -4 1 -5 6 ( vì mình chỉ sử dụng hàm hoán vị giữa 2 số thui mà). nhưng kêt quả khi chạy lại là 1 6 -4 -5.Code:#include <stdio.h> void nhap(int a[],int &n) { printf("nhap so pt"); scanf("%d",&n); for(int i=0;i<n;i++) { printf("a[%d]=",i); scanf("%d",&a[i]); } } void xuat(int a[],int n) { for(int i=0;i<n;i++) { printf("%d ",a[i]); } } void sx(int a[],int n) { int t; for(int i=0;i<n-1;i++) { for(int j=i+1;j<n;j++) { if(a[i]>0||a[j]>0) { if(a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } } if(a[j]<0||a[i]<0) { if(a[j]>a[i]) { t=a[i]; a[i]=a[j]; a[j]=t; } } } } } void main() { int a[10],n; nhap(a,n); sx(a,n); xuat(a,n); }
à mình hỏi thêm là tại sao đoạn code trên luon ra kết quả với dãy số dương trc rùi mới tới số âm...
-
04-01-2012 13:02 #2
Registered User
- Tham gia
- 03-08-2010
- Bài viết
- 141
- Like
- 0
- Thanked 21 Times in 20 Posts
thuật toán bạn sai rồi. Mình sẽ chỉ thuật toán làm thôi còn bạn tự code nhé
b1:lấy tất cả các số âm trong array ra, kèm thêm 1 mãng lưu vị trí các số âm trên vị trí đó
lấy vd ở trên thì bạn sẽ được 2 array thế này arr_so_am(-5,-4) và arr_vi_tri(0,2)
b2: sắp xếp mãng số âm lấy ra được
b3: lấy từng phần tử của mãng số âm đã sắp xếp bỏ theo thứ tự vào vị trí của array(dựa vào mãng lưu vị trí các số âm)
lấy vd ở trên arr_so_am_sap_xep(-4,-5)===>gán vào arr[arr_vi_tri[i]]=arr_so_am_sap_xep[i]
==>Tương tự cho số dương
-
04-01-2012 20:58 #3
Registered User
- Tham gia
- 04-01-2012
- Bài viết
- 16
- Like
- 0
- Thanked 3 Times in 3 Posts
Bạn xét a[i] được âm hay dương rồi tiếp đó bạn mới xét a[j] sẽ dễ dàng hơn rất nhiều!.
-
09-01-2012 17:04 #4
Registered User
- Tham gia
- 25-06-2007
- Bài viết
- 23
- Like
- 1
- Thanked 0 Times in 0 Posts
Nhầm 2 chỗ này:
if(a[i]>0||a[j]>0) => if(a[i]>0 && a[j]>0)
if(a[j]<0||a[i]<0) => if(a[j]<0 && a[i]<0)
Nguồn:
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i]>0||a[j]>0)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
if(a[j]<0||a[i]<0)
{
if(a[j]>a[i])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
}
Sửa:
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i]>0 && a[j]>0)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
if(a[j]<0 && a[i]<0)
{
if(a[j]>a[i])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
}
-
12-01-2012 10:04 #5
DDTH.com
- Tham gia
- 26-05-2011
- Bài viết
- 211
- Like
- 206
- Thanked 25 Times in 19 Posts
mình thì nghĩ nên chia ra thành các mảng gồm số âm và số không âm. sau đó sắp xếp các mảng riêng đó rồi ráp lại thì có sẽ sẽ dễ hơn
-
13-01-2012 15:23 #6
Registered User
- Tham gia
- 03-12-2011
- Bài viết
- 30
- Like
- 0
- Thanked 5 Times in 5 Posts


Quote

Bookmarks