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

Đề tài: Mergesort cài đặt đệ quy. Tại sao không chạy???

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

    Angry Mergesort cài đặt đệ quy. Tại sao không chạy???

    Mình mới viết một chuơng trình tính thời sắp xếp trên mảng các số nguyên tạo ngẫu nhiên bằng Mergesort đệ quy nhưng không chạy được.
    Các bạn xem hộ mình với nhá. Mình nghĩ là hàm merge của mình có vấn đề
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<time.h>
    #include<stdlib.h>
    #include<time.h>
    int *random(int n);
    int swap(int *a,int i,int j);
    int mergesort(int *a,int n);
    void mergesort(int *a,int p,int r);
    void merge(int *a,int p,int q,int r);
    int main()
    {
        int i,n;
        int *a;
        printf("Nhap so phan tu:");
        scanf("%d",&n);
        
        a=random(n);
        
          double timer;
        time_t t1;
        time_t t2;
        
         time(&t1);
        mergesort(a,0,n-1);
        time(&t2);
        timer=difftime(t2,t1);
        printf("Running time = %lf\n",timer);
    
        
        getch();
        
    
    }
        
    int *random(int n)
    {
        srand(time(NULL));
        int *a;
        int i;
        a=(int *)malloc(n*sizeof(*a));
        for(i=0;i<n;i++)
        {
        a[i]=rand();
        if(a[i]==32767) a[i]=a[i]-1;
        }
        return a;
    }
    void mergesort(int *a,int p,int r)
    {
         
         int q;
         if(p<r)
         {
         q=(p+r)/2;
         mergesort(a,p,q);
         mergesort(a,q+1,r);
         
         
         merge(a,p,q,r);}
         
         
    }
    void merge(int *a,int p,int q,int r)
    {
         int *L1;
         int *L2;
         int i,j,k;
         L1=(int *)malloc((q-p+2)*sizeof(*L1));
         L1=(int *)malloc((r-q+1)*sizeof(*L2));
         for(i=0;i<(q-p+1);i++)
         L1[i]=a[p+i];
         L1[i]=32767;
         for(i=0;i<(r-q);i++)
         L2[i]=a[q+i+1];
         L2[i]=32767;
         i=0;
         j=0;
         for(k=p;k<=r;k++)
         {
         if(L1[i]<=L2[j])
         {
                        a[k]=L1[i];
                        i=i+1;
         }
         else
         {
             a[k]=L2[j];
             j=j+1;
         }
         }
         free(L1);
         free(L2);
    }

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Cái này ko có máy nên ko test được để anh em test thử. Nhưng tớ khuyên cậu nếu bị sai thì trước hết nên thử code với một mảng do mình tạo sẵn. Sau đó chạy debug để tự kiểm tra trước ok.

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    L1=(int *)malloc((q-p+2)*sizeof(*L1));
    L1=(int *)malloc((r-q+1)*sizeof(*L2));
    L2 bị bắt cóc đâu mất rùi

    if(a[i]==32767) a[i]=a[i]-1;
    Chỗ này mình đoán có lẽ bạn xét nó vượt quá kiểu size của int, vậy chỉ khi == 32767 thôi à, vậy nếu nó bằng 32768 thì sao nhỉ ?

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

    Trích dẫn Nguyên bản được gửi bởi kidkid Xem bài viết
    Cái này ko có máy nên ko test được để anh em test thử. Nhưng tớ khuyên cậu nếu bị sai thì trước hết nên thử code với một mảng do mình tạo sẵn. Sau đó chạy debug để tự kiểm tra trước ok.
    Cảm ơn bạn nhá, nhưng trước đó mình đã thử rồi hàm random của mình chạy không sai.

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

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    L2 bị bắt cóc đâu mất rùi

    Chỗ này mình đoán có lẽ bạn xét nó vượt quá kiểu size của int, vậy chỉ khi == 32767 thôi à, vậy nếu nó bằng 32768 thì sao nhỉ ?
    Đúng là mình sai ở chỗ malloc cho L2 thật. Đãng trí quá

    Còn chỗ
    if(a[i]==32767) a[i]=a[i]-1;
    Đúng là vượt thật nhưng mình chạy thử thấy vẫn đúng.
    Chắc tạ trình dịch lấy tràn sang ô nhớ khác nhưng không đề lên biến khác nên không sao.

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

  1. Mọi người giúp mình kiểm tra code mergesort với ạ
    Gửi bởi goodlucks trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 20-04-2012, 09:36 AM
  2. Cấu trúc dữ liệu Mergesort bằng DSLK kép - Lỗi Mergesort.exe or any of the DLLs it has loaded?
    Gửi bởi xjke trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 0
    Bài viết cuối: 07-12-2011, 03:30 AM
  3. Lập trình C MergeSort multithreading in C - Cần giúp đỡ sửa lỗi!!
    Gửi bởi -Xme- trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 11
    Bài viết cuối: 11-07-2011, 09:25 AM
  4. Lập trình C MergeSort n mảng 1 lần
    Gửi bởi dungnt.fet trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 26-06-2011, 01:24 PM
  5. Thắc mắc mergesort???
    Gửi bởi kienchochethahaha trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 14-03-2010, 02:34 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