Hiển thị kết quả từ 1 đến 6 / 6
  1. #1
    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.
    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);
    }
    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.
    à 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...
    Quote Quote

  2. #2
    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

  3. #3
    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!.

  4. #4
    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;
    }

    }
    }
    }

  5. #5
    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

  6. #6
    Tham gia
    03-12-2011
    Bài viết
    30
    Like
    0
    Thanked 5 Times in 5 Posts
    Quote Được gửi bởi LPT.Evil.Inc View Post
    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
    Viết thử code thì sẽ thấy dễ hơn hay không. Suy nghĩ nhiều quá hay bị lạc đường.

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •