Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Sắp xếp mảng hai chiều, mong các bạn gợi ý?

  1. #1
    Ngày gia nhập
    03 2009
    Bài viết
    2

    Mặc định Sắp xếp mảng hai chiều, mong các bạn gợi ý?

    đề bài là thế này
    Cho ma trận 4x4 với các phần tử được nhập từ bàn phím, sắp xếp ma trận theo thứ tự tăng dần của các số chẵn rồi đến các số lẻ. Ví dụ:
    11 2 13 4
    5 9 3 7
    10 15 12 8
    6 14 1 16
    Sẽ được sắp xếp thành
    2 4 6 8
    10 12 14 16
    1 3 5 7
    9 11 13 15
    Lập lưu đồ và viết chương trình.
    Mình làm theo cách la tìm những phần tử lẻ rồi gán vào một mảng b.các phần tử chẵn gán vào mảng c.sau đó sắp xếp các phần tử trong mỗi dãy theo tăng dần.nhưng sau đó mình ko biết cách nào để đua các phần tử của 2 mảng
    b và C vào mảng 2 chiều ban đầu.bạn nào có cách chi hướng dẫn moi mình với.nếu được thì cho mình xin đoạn chương trình luôn nghe.cám ơn các bạn

  2. #2
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    Bạn có thể làm thế này: Xét chiều dài 2 cái mảng 1 chiều của bạn. tính số kết quả chia nguyên và số dư của 2 cái mảng đó với kích cỡ hàng hoặc cột rồi gán lần lượt. Hết phần nguyên thì đến phần dư. Bạn thử làm xem. Nếu bạn thấy khó hiểu thì post những gì bạn làm được theo cách này lên. Mọi người sẽ giúp đỡ.

  3. #3
    Ngày gia nhập
    11 2008
    Bài viết
    203

    Đã code xong phần ý tưởng của chủ Thớt, nhưng tớ dùng đến 3 mảng với kích cỡ bằng m*n; Bạn có thể chỉnh sửa lại để chỉ cần sử dụng 2 mảng với kích thước nhỏ hơn.
    Tested, chạy tốt, đúng ý tưởng!
    PHP Code:
    #include<stdio.h>
    #include<conio.h>
    #include<malloc.h>
    int MANG2CHIEU[20][20];
    int dongcot;
    int *mang1chieu_CHAN,*mang1chieu_LE, *mang1chieuAchan=0,le=0chanvale=0;;
    void    NHAP();
    void    XUAT();

    void    HOANVI(int&,int&);
    void    SAPXEP(int *mangint);
    void    COPYMANG(int*,int*,int*);
    void    CHUYENSANG2CHIEU();
    int main()
    {    
        
    NHAP();
        
    XUAT();
        
    getch();
        
    }


    void    NHAP()
    {
        
        
    printf("Nhap vao so dong: ");scanf("%d",&dong);
        
    printf("Nhap vao so cot: ");scanf("%d",&cot);
        
    mang1chieu_CHAN=(int*)malloc(dong*cot*(sizeof(int)));
        
    mang1chieu_LE=(int*)malloc(dong*cot*(sizeof(int)));
        
    mang1chieuA=(int*)malloc(dong*cot*(sizeof(int)));
        for(
    int i=0;i<dong;i++)
        {
            for(
    int j=0;j<cot;j++)
            {
                 
    printf("Nhap vao phan tu A[%d][%d]: ",i,j);
                
    scanf("%d",&MANG2CHIEU[i][j]);
                    if(
    MANG2CHIEU[i][j]%2==0)
                        
    mang1chieu_CHAN[chan++]=MANG2CHIEU[i][j];
                    else
                        
    mang1chieu_LE[le++]=MANG2CHIEU[i][j];
                            
            }
        }    
    }
    void XUAT()
    {
            
    printf("\n");
            for(
    int i=0;i<dong;i++)
            {
                for(
    int j=0;j<cot;j++)
                {
                    
    printf("%d ",MANG2CHIEU[i][j]);
                    
                }
                
    printf("\n");
            }
            
    SAPXEP(mang1chieu_CHAN,chan);
            
    SAPXEP(mang1chieu_LE,le);
            
    COPYMANG(mang1chieu_CHAN,mang1chieu_LE,mang1chieuA);
            
    CHUYENSANG2CHIEU();
            
            
    printf("\n");
            for(
    int i=0;i<dong;i++)
            {
                for(
    int j=0;j<cot;j++)
                {
                    
    printf("%d ",MANG2CHIEU[i][j]);
                    
                }
                
    printf("\n");
            }
            
            
    //DOAN NAY DE BAN THAM KHAO, KHONG THICH THI KHONG CAN THAM KHAO
            /*SAPXEP(mang1chieu_CHAN,chan);
            printf("\n\nMang chan:\n");
        
            for(int i=0;i<chan;i++)
                printf("%d ",mang1chieu_CHAN[i]);
            SAPXEP(mang1chieu_LE,le);
            printf("\n\nMang le:\n");
            for(int i=0;i<le;i++)
                printf("%d ",mang1chieu_LE[i]);
            
            printf("\nMang chan le: \n");
            COPYMANG(mang1chieu_CHAN,mang1chieu_LE,mang1chieuA);
            for(int i=0;i<chanvale;i++)
                printf("%d ",mang1chieuA[i]);*/
    }
    void HOANVI(int &a,int&b)
    {
        
    int temp;
        
    temp=a;
        
    a=b;
        
    b=temp;    
        
    }
    void    SAPXEP(int *mangint n)
    {
        for(
    int i=0;i<n-1;i++)
        {
            for(
    int j=i+1;j<n;j++)
            {
                if(
    mang[j]<mang[i])
                    
    HOANVI(mang[j],mang[i]);
            }
        }    
        
    }
    void    COPYMANG(intmang1,intmang2,intmang3)
    {
            if(
    chan>0)
            {    
    int i=chan;
                do
                {        
                    
    mang1chieuA[chanvale++]=mang1chieu_CHAN[chan-i];
                }while(
    i-->1);
                
            }
            if(
    le>0)
            {    
    int i=le;
                do
                {        
                    
    mang1chieuA[chanvale++]=mang1chieu_LE[le-i];
                }while(
    i-->1);
                
            }
                
    }
    void    CHUYENSANG2CHIEU()
    {
            
    int k=chanvale;
            for(
    int i=0;i<dong;i++)
            {
                for(
    int j=0;j<cot;j++)
                {
                    
    MANG2CHIEU[i][j]=mang1chieuA[chanvale-k];
                    
    k--;
                }
            
            }    
        
        

    Tôi tin rằng: giải thuật thì có thể tìm trong hàng trăm GB ebook, hoặc Google nhưng code chạy thì chưa chắc! Hãy post code để chứng tỏ giải thuật của bạn là đúng!
    Giải thuật là bản thiết kế của ngôi nhà, code là phần xây dựng. Nếu chỉ xây nhà trên giấy thì ta sống chả khác nào người nguyên thủy.

  4. #4
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    Sao lại phải dùng 3 mảng 1 chiều hả Love?
    Mình chỉ cần 2 mảng thôi. nhưng không biết độ phức tạp thế nào.
    Code:
    int k=0; m=0;
    //code chuyen 2c --> 1c
    for(int i=0;i<dong;i++)
          for(int j=0;j<cot;j++)
                if(a[i][j]%2=0)
                       {b[k]=a[i][j];k++;)
                else {c[m]=a[i][j];m++;)
    Code:
    //code chuyen 1 -->2 chieu
    int t,r,n=0,m=0;
    t=k/dong;
    r=k%dong;
    for(i=0;i<t;i++)
         for(j=0;j<cot;j++)
             {a[i][j]=b[n];n++;}
    for(i=0;i<r;i++)
         {a[t][i]=b[n];n++;)
    for(i=r;i<cot;++i)
         {a[t][i]=c[m];m++;}
    for(i=t+1;i<dong;i++)
         for(j=0;j<cot;j++)
           {a[i][j]=c[m];m++;}
    Đã được chỉnh sửa lần cuối bởi trungkien45 : 07-04-2009 lúc 04:42 PM.

  5. #5
    Ngày gia nhập
    01 2009
    Bài viết
    165

    đây chỉ là bài tập sắp xếp bình thường đâu cần dùng mảng.bạn chạy từ đầu đến cuối ma trân bạn tìm phần tử chẵn nhỏ nhất rồi hoán vị với phần tử đầu tiên ,chọn phần tử chãn thứ 2 nhỏ nhất trong mảng và lớn hơn phần tử thứ 1,rồi hoán vị nó với phần tử thứ 2,...tổng quát là chọn phần tử chẵn thứ i nhỏ nhất trong mảng và lớn hơn phần tử thứ i-1 rồi hoán vị nó với phần tử thứ i trong mảng.ví dụ:ma trận sau khi sắp xếp:
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16;
    chọn pt chẵn nhỏ thứ 1 là 2;hoán vị 2 với pt thứ 1:2 1 3 4 5 6...;\
    chọn pt chẵn nhỏ thứ 2 là 4;hoán vị với pt thứ 2: 2 4 3 1 5 6...;
    chọn pt chẵn nhỏ thứ 3 là 6;hoán vị với pt thứ 3: 2 4 6 1 5 3..;
    cứ tiếp tục cho đến khi ko tìm được phần tử chẵn nào nữa,rồi bạn đánh dấu phần tử chẵn cuối cùng sau khi sắp xếp = 1 biến t nào đó rồi tiếp tục làm như vậy với các số lẻ nhưng thay đổi 1 tý đó là phần tử lẻ nhỏ nhất thứ i trong mảng thì hoán vị với phần tử thứ i+t trong mảng .bạn thử xem.
    Đã được chỉnh sửa lần cuối bởi kimduquan : 07-04-2009 lúc 05:22 PM.

  6. #6
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    Mặc định Sắp xếp mảng hai chiều, mong các bạn gợi ý?

    Nhưng nếu 2 phần tử lẻ liền nhau thì sao? kimduquan.

  7. #7
    Ngày gia nhập
    01 2009
    Bài viết
    165

    nếu 2 phần tử lẻ liền nhau thì nó sẽ bỏ qua để tìm phần tử chẵn tiếp theo.ví dụ:
    1 2 3 5 6 6 7
    thì sau khi chọn pt chẵn đầu là 2 thì nó sẽ chọn 6 vì 6 là pt chẵn nhỏ nhất và lớn hơn 2 rồi hoán vị với pt thứ 2 vì 6 là phần tử chẵn nhỏ thứ 2 trong mảng:
    1 2 6 5 3 6 7.
    còn trường hợp 2 số chẵn liền nhau thì nó sẽ hoán vị với chính nó,và kết quả ko đổi
    Đã được chỉnh sửa lần cuối bởi kimduquan : 07-04-2009 lúc 05:32 PM.

  8. #8
    Ngày gia nhập
    11 2008
    Bài viết
    203

    Bạn cho mình xin code đi!
    Tôi tin rằng: giải thuật thì có thể tìm trong hàng trăm GB ebook, hoặc Google nhưng code chạy thì chưa chắc! Hãy post code để chứng tỏ giải thuật của bạn là đúng!
    Giải thuật là bản thiết kế của ngôi nhà, code là phần xây dựng. Nếu chỉ xây nhà trên giấy thì ta sống chả khác nào người nguyên thủy.

  9. #9
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    Đành là vậy. Lúc đó đang vội ko suy nghĩ.
    Bài này còn 1 cách nữa là : sau khi sắp sếp 2 mảng thì gán mảng lẻ vào phần còn lại của mảng chẳn, rồi gán vào mảng 2 chiều. chỉ cần 2 mảng và không phải hoán vị. Được chứ.
    Cách của mình tốn không gian hơn cách của kimduquan.

Các đề tài tương tự

  1. Trả lời: 2
    Bài viết cuối: 21-04-2013, 09:46 AM
  2. Trả lời: 1
    Bài viết cuối: 28-04-2012, 09:43 PM
  3. Không như mong muốn khi sử dụng toán tử sizeof lấy chiều dài chuỗi [quizz]
    Gửi bởi first_pace trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 36
    Bài viết cuối: 29-07-2011, 09:42 AM
  4. Lập trình C++ với mảng 2 chiều, mong các bạn sửa lỗi giúp?
    Gửi bởi teodainhan trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 09-05-2009, 07:52 PM

Quyền hạn của bạn

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