Announcement

Collapse
No announcement yet.

[C++] Sắp xếp mảng tăng của mảng 2 chiều

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C++] Sắp xếp mảng tăng của mảng 2 chiều

    bạn nào anh nào pro giải thích dùm em các thuật toán này giúp em. Thank !!
    PS: chỗ mà i/c với i%c ấy
    PHP Code:
    void sapxeptang(int a[][20], int dint c)
    {
        for (
    int i=0i<d*c;i++)
            for (
    int j=0j<d*c;j++)
                if (
    a[i/c][i%c] < a[j/c][j%c])
                {
                    
    int tmp a[i/c][i%c] ;
                    
    a[i/c][i%c] = a[j/c][j%c] ;
                    
    a[j/c][j%c] = tmp ;
                }

    Hãy cứ sống một cách thật tuyệt vời, rồi những điều tốt đẹp sẽ đến với bạn !!

  • #2
    Bạn nên post cả Input và nếu cần thiết thì post toàn bộ code lên để cho tiện
    Khi ta chào đời, ta khóc mọi người cười
    Sống sao để khi chết đi ta cười còn mọi người khóc.


    Cuộc đời chỉ đáng sống khi còn bạn bè, người thân và quan trọng nhất là ta còn có thể đem lại niềm vui cho người khác

    Comment


    • #3
      cái này là thuật toán sắp xếp đổi chỗi trực tiếp thôi. mảng 2 chiều thực ra cũng như mảng 1 chiều với số phần tử là d*c. còn chia nguyên và chia lấy dư thì...e cứ viết ra giấy, chạy từng dòng là hiểu à

      Comment


      • #4
        chia nguyên vs chia lấy dư ??? vd: i=0, j=1, c=2 if( a[0][0]<a[1/2][5] )là sao ???
        Hãy cứ sống một cách thật tuyệt vời, rồi những điều tốt đẹp sẽ đến với bạn !!

        Comment


        • #5
          Như vậy, thì hình dung mảng cần sắp xếp là 1 ma trận có d hàng và c cột.
          Mình lấy ví dụ c=2 và d=3 =>c*d=6.
          Ví dụ ma trận ban đầu:
          4 7
          2 1
          7 9
          • i=0
            • j=0
              So sánh: a[i/c][i%c] với a[j/c][j%c] (tức là a[0][0] với a[0][0])
              4 không nhỏ hơn 4 => không làm gì cả.
            • j=1
              So sánh: a[i/c][i%c] với a[j/c][j%c] (tức là a[0][0] với a[0][1])
              4<7 => đổi chỗ 4 và 7. Ma trận trở thành:
              7 4
              2 1
              7 9
            • j=2
              So sánh: a[0][0] với a[1][0]
              7 không nhỏ hơn 2 => không làm gì cả.
            • j=3
              So sánh: a[0][0] với a[1][1]
              7 không nhỏ hơn 1 => không làm gì cả.
            • j=4
              So sánh: a[0][0] với a[2][0]
              7 không nhỏ hơn 7 => không làm gì cả.
            • j=5
              So sánh: a[0][0] với a[2][1]
              7<9 => Đổi chỗ 7 và 9. Ma trận trở thành
              9 4
              2 1
              7 7

          • i=1
            • j=0
              So sánh: a[0][1] với a[0][0]
              4<9 => Đổi chỗ 4 và 9. Ma trận trở thành
              4 9
              2 1
              7 7
            • j=1
              So sánh: a[0][1] với a[0][1]
              9 không nhỏ hơn 9.
            • j=2
              So sánh: a[0][1] với a[1][0]
              9 không nhỏ hơn 2.
            • j=3
              So sánh: a[0][1] với a[1][1]
              9 không nhỏ hơn 1.
            • j=4
              So sánh: a[0][1] với a[2][0]
              9 không nhỏ hơn 7.
            • j=5
              So sánh: a[0][1] với a[2][1]
              9 không nhỏ hơn 7.

          • i=2
            Tương tự
          • i=3
            Tương tự
          • i=4
            Tương tự
          • i=5
            Tương tự

          Kết quả cuối cùng:
          1 2
          4 7
          7 9
          Bạn tự chạy khúc sau nhé -.-. Lời khuyên: Mai mốt hỏi thì bạn đưa input với ghi chú các tham số lên để ai muốn giúp nắm đề bài cho nhanh nhé.
          Last edited by 12520238; 03-01-2013, 23:43.
          Khi ta chào đời, ta khóc mọi người cười
          Sống sao để khi chết đi ta cười còn mọi người khóc.


          Cuộc đời chỉ đáng sống khi còn bạn bè, người thân và quan trọng nhất là ta còn có thể đem lại niềm vui cho người khác

          Comment


          • #6
            Originally posted by 12520333 View Post
            bạn nào anh nào pro giải thích dùm em các thuật toán này giúp em. Thank !!
            PS: chỗ mà i/c với i%c ấy
            PHP Code:
            void sapxeptang(int a[][20], int dint c)
            {
                for (
            int i=0i<d*c;i++)
                    for (
            int j=0j<d*c;j++)
                        if (
            a[i/c][i%c] < a[j/c][j%c])
                        {
                            
            int tmp a[i/c][i%c] ;
                            
            a[i/c][i%c] = a[j/c][j%c] ;
                            
            a[j/c][j%c] = tmp ;
                        }

            Hàm này sử dụng kỹ thuật duyệt mảng 2 chiều bằng một vòng lặp for như là mảng một chiều. Biến đếm sẽ chạy từ 0 tới d * c - 1, duyệt qua tất cả phần tử trong mảng. Cách chuyển từ chỉ số trong mảng một chiều sang vị trí trong mảng 2 chiều là:
            + Có c phần tử trên một dòng, vậy dòng hiện tại ứng với chỉ số i là i / c.
            + Trên dòng đó, i % c là cột hiện tại.

            Viết lại cho dễ hiểu:

            PHP Code:
            #define a(i) a[i / c][i % c]
            void sapxeptang(int a[][20], int dint c)
            {
                for (
            int i=0i<d*c;i++)
                    for (
            int j=0j<d*c;j++)
                    {
                        if (
            a(i) < a(j))
                        {
                            
            int tmp a(i) ;
                            
            a(i) = a(j);
                            
            a(j) = tmp ;
                        }
                    }

            Hoặc dùng 4 vòng lặp:
            PHP Code:
            void sapxeptang(int a[][20], int dint c)
            {
                for (
            int i_dong=0i_dong<d;i_dong++)
                  for (
            int i_cot=0i_cot<c;i_cot++)
                  {
                    for (
            int j_dong=0j_dong<d;j_dong++)
                      for (
            int j_cot=0j_cot<c;j_cot++)
                     {
                        if (
            a[i_dong][i_cot] < a[j_dong][j_cot])
                        {
                            
            int tmp a[i_dong][i_cot] ;
                            
            a[i_dong][i_cot] = a[j_dong][j_cot] ;
                            
            a[j_dong][j_cot] = tmp ;
                        }
                      }
                  }

            Last edited by CH0901050; 04-01-2013, 12:22.

            Comment


            • #7
              Mình nói thật nếu làm = C hay C++ thì thật sự ko cần phức tạp zậy đâu, nếu dùng mảng tiĩnh hoặc mảng động biết cách cấp phát chút ( làm cho liền nhau ) thì mảng đa chiều của bạn có thể coi như là mảng 1 chiều có số phần tử = tích số phần tử các chiều thôi, rồi sắp xếp trên mảng 1 chiều đó là ok :smile:
              _____
              bạn chỉ cần cast cái con trỏ trỏ đếu đầu mảng đa chiều thành con trỏ cấp 1 là coi như nó thành mảng 1 chiều số phần tử = tích của số các phần tử trong mảng đa chiều
              Last edited by 11520051; 13-01-2013, 10:48.

              Comment


              • #8
                Mình đồng ý là nên dùng một thuật toán sắp xếp đơn giản hơn là đoạn code phức tạp ban đầu.

                Comment

                LHQC

                Collapse
                Working...
                X