Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 6 của 6
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Về thuật toán sắp xếp trộn, không cài đặt đc, mọi người cho ý kiến đi. đc

    Mã:
    #include<stdio.h>#include<conio.h>int A[100];void merge(int A[],int p,int q,int r){     int l[100],n[100],i,j,k;     l[q-p+1]=10000; n[r-q+1]=10000;     for(i=p;i<=q;i++)          l[i-p]=A[i];     for(i=q;i<=r;i++)     n[i-q]=A[i];     i=0;j=0;     for(k=p;k<=r;k++)     if(l[i]<n[j])     {                  A[k]=l[i];                  i++;     }     else      {                  A[k]=n[j];                  j++;     }}void merge_sort(int A[],int p,int r){int q;if(p<r){       q=(p+r)/2;       merge_sort(A,p,q);       merge_sort(A,q++,r);       merge(A,p,q,r);}} main(){     int i,n;     printf("
     hay nhap vao so phan tu cua mang");     scanf("%d",&n);     for(i=1;i<=n;i++)     {                     printf("
     A[%d]=",i);                     scanf("%d",&A[i]);     }     merge_sort(A,1,n);     for(i=1;i<=n;i++)     printf("
     %d",A[i]);     getch();}

  2. #2
    Theo em anh birthis nên dùng "lính canh" trong hàm Merge như bạn kia cho đỡ lằng nhằng, chỉ có if và else. cấp phát động trong hàm merge rất hay, e cũng làm như thế [IMG]images/smilies/biggrin.png[/IMG][IMG]images/smilies/biggrin.png[/IMG] có điều comment của em thì k được rõ ràng như a, phải học tập mới được [IMG]images/smilies/biggrin.png[/IMG][IMG]images/smilies/biggrin.png[/IMG]

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    @ chủ topic : bạn cho code vào thẻ đi ![IMG]images/smilies/17.gif[/IMG][IMG]images/smilies/17.gif[/IMG][IMG]images/smilies/17.gif[/IMG][IMG]images/smilies/17.gif[/IMG]

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Có lẽ bạn nên đọc 1 chút về kỹ thuật lập trình để viết code rõ ràng sáng sủa dễ đọc hơn. Bắt đầu từ cách đặt tên biến, cho đến chú thích.[IMG]images/smilies/smile.png[/IMG]
    Bài trên của bạn khó đọc quá và không có chú thích nên rất khó hiểu. Đây là đoạn code của mình, có chú thích khá rõ, dùng để học tập về thuật toán sắp xếp trộn, bạn có thể xem qua:

    Mã:
    /*Ten ham : Merge_SortMuc dich: Sap xep tang dan danh sach list tu start den end          bang giai thuat sap xep tronDau vao : - Danh sach list          - Diem bat dau cua day: start          - Diem ket thuc day : endDau ra  : - Danh sach list tu start den end da duoc sap xep*/void Merge_Sort(float* list,int start,int end){    if( start < end){        int mid = (start+end)/2;        Merge_Sort(list,start,mid);        Merge_Sort(list,mid+1,end);        Merge(list,start,mid,end);    }}/*Ten ham : MergeMuc dich: Tron 2 day con da duoc sap xep tang dan, thanh 1 day duoc sap xep          tang dan gom tat ca cac phan tu cua ca 2 day con.Dau vao : - Danh sach list          - Diem bat dau cua day 1: start          - Diem ket thuc day 1:mid          - Diem bat dau day 2: mid + 1          - Diem ket thuc day 2 : endDau ra  : - Danh sach list tu start den end da duoc sap xep tang dan*/void Merge(float* list,int start,int mid,int end){     float* tmp = new float[end-start+1];    int j=start;//Con chay tren day 1    int k=mid+1;//Con chay tren day 2     for( int i=end-start;i>=0;--i){        /*        Chi co 3 truong hop: - Day 1 het, day 2 con                             - Day 2 het, day 1 con                             - Ca 2 day con        Khong co truong hop ca 2 day cung het vi neu 2 day cung het        thi vong lap se ket thuc. Do do 2 truong hop phia duoi        khong can kiem tra k <= end hay j <= mid        */        if(j == mid +1){            //Truong hop day 1 da het,            //copy phan con lai cua day 2 vao ket qua            tmp[end-start-i] = list[k];            ++k;        }        else if(k == end +1){            //Truong hop day 2 da het,            //copy phan con lai cua day 1 vao ket qua            tmp[end-start-i] = list[j];            ++j;        }        else if( list[j] < list[k] ){            //Dua phan tu vi tri j cua day 1 vao day ket qua            tmp[end-start-i] = list[j];            ++j;        }        else{            //Dua phan tu vi tri k cua day 2 vao day ket qua            tmp[end-start-i] = list[k];            ++k;        }    }    //Copy ket qua tro lai danh sach list    for( int i=0;i<=end-start;++i){        list[start+i] = tmp[i];    }    delete[] tmp;}

  5. #5
    vòng for 2 cũng sai từ q+1 mới đúng

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Thực sự thì đọc mãi mình vẫn không thể hiểu được cách thức hoạt động của cái thuật toán này

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • 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
  •