Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 26 kết quả

Đề tài: sắp xếp 2 dãy số tăng dần

  1. #1
    Ngày gia nhập
    12 2011
    Bài viết
    23

    Mặc định sắp xếp 2 dãy số tăng dần

    mình có 1 bài tập: Nhập số liệu cho 2 dãy số thực a0 , a1 ,..., am-1 và b0 , b1 ,..., bn-1. Giả sử cả 2 dãy này đã được sắp theo thứ tự tăng dần. Hãy tận dụng tính sắp xếp của 2 dãy và tạo dãy c0 , c1 ,..., cm+n-1 là hợp của 2 dãy trên, sao cho dãy ci cũng có thứ tự tăng dần . (Gợi ý: So sánh và loại dần từng cặp phần tử của 2 dãy).
    và mình đã code hoàn chỉnh
    Code:
    #include<conio.h>
    #include<stdio.h>
    #include<math.h>
    int a[100],b[100],n,m;
    int c[100];
    void nhap(){
    
                int i;
               printf("so phan tu n= ");
               scanf("%d",&n);
             for(i=1;i<=n;i++)
              {printf("nhap a[%d] ",i);
              scanf("%d",&a[i]);}     
             i=1;
              printf("so phan tu m= ");
               scanf("%d",&m);
              for(i=1;i<=m;i++)
             {printf("nhap b[%d] ",i);
              scanf("%d",&b[i]);}
    }
    void xuly(int a[100],int b[100])
    {int i=1,j=1;
       if(n<=m)// so phan tu cua a[] nho hon b[]
          {   while(j<=2*n){
                             if(a[i]<b[i]) 
                             { c[j]=a[i];c[j+1]=b[i];}
                            else 
                             { c[j]=b[i];c[j+1]=a[i];}
                             j=j+2;
                            i++;
                            }
              i=2*n+1;
              while(i<=m+n) {c[i]=b[i-n];i++;}
          }
    
    else {i=1,j=1;  
          while(j<=2*m){                    //so phan tu cua a[]>b[]
                          if(a[i]<b[i]) 
                           { c[j]=a[i];c[j+1]=b[i];}
                         else 
                         { c[j]=b[i];c[j+1]=a[i];}
                          j=j+2;
                          i++;
                          }
          i=2*m+1;
          while(i<=m+n) {c[i]=a[i-m];i++;}
    }
    
      for(int j=1;j<=m+n;j++)
      printf("%d ",c[j]);
       }
      main()
      {nhap();
      xuly(a,b);
      getch();}
    nhưng mình thấy cách này còn dài và phức tạp hơn việc nhập 2 dãy lại làm 1 dãy c[] rồi dùng hàm săp xếp dẵy c[ ] ấy, bạn nào có thuật toán tối ưu hơn xin giúp đỡ mình, xin cảm ơn

  2. #2
    Ngày gia nhập
    10 2011
    Bài viết
    552

    nhưng mình thấy cách này còn dài và phức tạp hơn việc nhập 2 dãy lại làm 1 dãy c[] rồi dùng hàm săp xếp dẵy c[ ] ấy
    Cách này chỉ dành cho những ai lười suy nghĩ, ko chịu động não.
    Đề bài đã nói rõ "Vận dụng tính đã sắp xếp của 2 dãy input" . Cho nên phải dựa vào đó mà làm
    Vì nhờ nó đã sắp xếp nên việc xử lý, làm bao nhiêu phép toán để chạy acis này nó sẽ giảm, và tối ưu.
    Còn việc nhắm mắt nhắm mũi chập 2 cái vào rồi sắp xếp lại từ đầu thì chả khác gì công dã tràng.

    Cái gì cũng có acis giá của nó. Anh đầu tư nhiều chất xám vào để a có 1 sản phẩm tốt. Anh đầu tư ít chất xám thì sản phẩm a chỉ là cùi cùi
    ___
    Về code :
    -Vẫn chưa biết cách viết 1 cái code gì cả, viết lung tung. Trong sách đều có code mẫu, nhìn cách trình bày và làm theo. Muốn thụt vào thì bấm tab (nếu trình C của bạn ko tự động thụt vào).
    -Code chả trong sáng gì.
    C++ Code:
    1. if(n<=m)// so phan tu cua a[] nho hon b[]
    2.       {   while(j<=2*n){ // Tại sao lại chỉ chạy đến n/2 ???
    3.                          if(a[i]<b[i])
    4.                          { c[j]=a[i];c[j+1]=b[i];}
    5.              // Chắc gì c[j+1]=b[i] ? Nhỡ a[i+1] <= b[i] thì sao ? Thì c[j+1] phải = a[i+1] chứ ?
    6.                         else
    7.                          { c[j]=b[i];c[j+1]=a[i];}
    8.                          j=j+2;
    9.                         i++;
    10.                         }
    11.           i=2*n+1; // Chỗ này là gì đây ? Phải chú thích hoặc là mô tả tư tưởng ra cho người ta hiểu
    12.           while(i<=m+n) {c[i]=b[i-n];i++;}
    13.       }
    Code viết luộm thuộm quá.
    Những cái gì chung thì để ra ngoài. Cả 2 trường hợp if, và else đều làm chung 1 công việc, lại phải đi viết lại 2 lần. May là if else 2 lần chứ if else if else if else if else thì viết luôn cả 5 lần ?

    Giải thuật sai rồi bạn hiền ơi(hoặc là đã hiểu dc giải thuật nhưng biểu diễn còn thiếu sót, thiếu chính xác, chưa thấu đáo)

    Giải quyết :
    Vẽ 2 cái mảng input ra giấy. Vẽ theo dạng sợi dây nằm dọc ấy . Cái mảng output nằm ở giữa.
    Mảng bên trái như sau : 1 3 4 7 10
    Mảng bên phải như sau: 0 1 2 4 6 9 11 .
    Rồi tự thao tác = tay xem sẽ lắp lần lượt cái gì vào mảng output ở giữa.
    Lắp xong xuôi ắt sẽ ngộ ra tư tưởng. Sau đó bắt tay vào code (hoặc sửa code cũ lại cho đúng)
    _____
    Tưởng tượng thế này :
    1 người làm việc đóng thùng hàng ngồi với 1 cái cân (cân đĩa ấy). 2 bên là 2 dãy các bao hàng xếp từ nhẹ tới nặng.
    Lần lựot bốc ở mỗi bên 1 bao trên cùng(Đầu hàng). Bỏ lên cân:
    - Bao nào nhẹ hơn thì bỏ vào thùng. Bao nặng hơn vẫn còn nằm trên cân.
    - Bốc tiếp ở dãy hàng bên phía có chứa bao nhẹ lúc nãy 1 bao ở đầu. Lại bỏ lên cân.
    Lặp lại việc kiêm tra.

    làm khi nào có 1 bên hết. Thì lần lượt nhét đống còn lại của bên còn vào thùng
    Đã được chỉnh sửa lần cuối bởi clchicken : 30-12-2011 lúc 07:40 PM.
    Um Mani Padme Hum...!!

  3. #3
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Lúc vào hộp này, chú ý mấy cái đề đỏ chói ờ đầu hộp, vào xem một chút sẽ thấy bài giải, code lẫn phê bình thuật toán đầy đủ.

  4. #4
    Ngày gia nhập
    12 2011
    Bài viết
    23

    Tưởng tượng thế này :
    1 người làm việc đóng thùng hàng ngồi với 1 cái cân (cân đĩa ấy). 2 bên là 2 dãy các bao hàng xếp từ nhẹ tới nặng.
    Lần lựot bốc ở mỗi bên 1 bao trên cùng(Đầu hàng). Bỏ lên cân:
    - Bao nào nhẹ hơn thì bỏ vào thùng. Bao nặng hơn vẫn còn nằm trên cân.
    - Bốc tiếp ở dãy hàng bên phía có chứa bao nhẹ lúc nãy 1 bao ở đầu. Lại bỏ lên cân.
    Lặp lại việc kiêm tra.
    làm khi nào có 1 bên hết. Thì lần lượt nhét đống còn lại của bên còn vào thùng
    cám ơn pro đã chỉ giáo
    Code:
    #include<conio.h>
    #include<stdio.h>
    #include<math.h>
    int a[100],b[100],n,m;
    int c[100];
    void nhap(){
               int i;
               printf("so phan tu day 1= ");
               scanf("%d",&n);
               for(i=1;i<=n;i++)
               {printf("nhap a[%d] ",i);
               scanf("%d",&a[i]);}     
               i=1;
               printf("so phan tu day 2= ");
               scanf("%d",&m);
               for(i=1;i<=m;i++)
               {printf("nhap b[%d] ",i);
               scanf("%d",&b[i]);}
    }
    
    void xuly(int a[100],int b[100])
    {  int i=1,j=1,k=1,c[100];
       for(k=1;k<=m+n;k++)
       {  if(i>n||j>m) break;
      
       if(a[i]<=b[j]) {c[k]=a[i];i++;}
       else {c[k]=b[j];j++;}
       }
    
       if(j>m) while (i!=n+1)
                      {c[k]=a[i];k++;i++;}
    
       else  while (j!=m+1)
                    {c[k]=b[j];k++;j++;}
      
                    for(i=1;i<=m+n;i++)
                    printf(" %d",c[i]);
                       
    }
    main(){
           nhap();
           xuly(a,b);
           getch();}

  5. #5
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    C Code:
    1. // hàm trộn hai mảng tăng dần a, b; ghi vào mảng c
    2. // code dùng kỹ thuật con tró cho nhanh
    3.  
    4. int TronMangTangDan(int *a, int na, int *b, int nb, int *c, int *nc)
    5. {
    6.   int *ac = a + na - 1; // địa chỉ của pt cuối mảng a
    7.   int *bc = b + nb - 1; // địa chỉ của pt cuối mảng b
    8.   while (a <= ac && b <= bc)
    9.     *c++ = (*a < *b)? *a++ : *b++;
    10.   while (a <= ac) *c++ = *a++;
    11.   while (b <= bc) *c++ = *b++;
    12.   return (*nc = na+nb);
    13. }

  6. #6
    Ngày gia nhập
    12 2011
    Bài viết
    23

    Mặc định sắp xếp 2 dãy số tăng dần

    ^
    anh ơi em trình độ còn gà lắm,chắc chưa hiểu đc hết đâu, cám ơn anh,sau này em sẽ nghiên cứu

  7. #7
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Trích dẫn Nguyên bản được gửi bởi edconan93 Xem bài viết
    ^
    anh ơi em trình độ còn gà lắm,chắc chưa hiểu đc hết đâu, cám ơn anh,sau này em sẽ nghiên cứu
    Học mảng trên C thì phải biết con trỏ. Đừng thấy nó "rườm rà" mà ko học, ko học thì sau này "chết" đấy.
    Phần này thì các sách luôn ghi tiêu đề bài là "MẢNG VÀ CON TRỎ", vậy chớ đừng để mất lòng vế sau.

    Vào ngay phần này rồi thì nghiên cứu bây giờ luôn đi chứ "sau này nghiên cứu" thì e rằng chỉ là nói mồm, xong rồi byebye. Hoặc có sau này nghiên cứu thật thì quá là phí phạm thời gian. trong khi con trỏ chưa thông thì các bài tập của chương trình về sau này ko làm tốt được, mà làm ko tốt dc thì điểm thấp , thì chết
    Vì sợ "chết", nên phải lọ mọ quay lại học con trỏ, mà 1/2 cái đầu đang bị rối bời vì "hix, sốt ruột quá, bài tập này giờ lung tung cả lên làm sao mà làm, ngày ... nộp bài rồi". Cho nên hiệu quả học hành lại càng giảm sút, dễ đi vào bế tắc
    Đã được chỉnh sửa lần cuối bởi clchicken : 31-12-2011 lúc 12:20 PM.
    Um Mani Padme Hum...!!

  8. #8
    Ngày gia nhập
    12 2011
    Bài viết
    23

    mà làm ko tốt dc thì điểm thấp , thì chết
    hehehe trúng tâm lý anh em quá

    Code:
    //cho mình hỏi 
    int TronMangTangDan(int *a, int na, int *b, int nb, int *c, int *nc)// na có ý nghĩa gì??
    {
      int *ac = a + na - 1; // *ac có ý nghĩa gì??
      int *bc = b + nb - 1; // 
      while (a <= ac && b <= bc)
        *c++ = (*a < *b)? *a++ : *b++;
      while (a <= ac) *c++ = *a++;
      while (b <= bc) *c++ = *b++;
      return (*nc = na+nb);
    }
    na có ý nghĩa gì??
    *ac có ý nghĩa gì??
    Đã được chỉnh sửa lần cuối bởi edconan93 : 01-01-2012 lúc 04:45 PM.

  9. #9
    Ngày gia nhập
    12 2011
    Bài viết
    23

    ^ pro nào giúp mình với
    sao con trỏ lại có 2 ký tự????

  10. #10
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Trích dẫn Nguyên bản được gửi bởi edconan93 Xem bài viết
    ^ pro nào giúp mình với
    sao con trỏ lại có 2 ký tự????
    Hỏi ngớ ngẩn.
    Quay lại bài đầu tiên, bài vỡ lòng về lập trình C. Xem quy tắc đặt tên biến
    Um Mani Padme Hum...!!

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

  1. Dịch vụ tăng like facebook và tăng vote google +1
    Gửi bởi raovatgirevn trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 07-05-2012, 11:26 AM
  2. Thuật toán chuyển dãy tăng giảm thành dãy tăng?
    Gửi bởi anhtran trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 5
    Bài viết cuối: 12-03-2012, 07:40 AM
  3. help!! chèn 1 số vào mảng tăng khồng làm thay đổi tính tăng bằng danh sách liên kết đơn....
    Gửi bởi nobita_1992 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 20-11-2011, 09:03 PM
  4. sắp xếp mảng số nguyên chẵn tăng dần, lẻ tăng dần, không dùng mảng tạm
    Gửi bởi hailoc12 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 09-08-2006, 11:44 AM

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