Quay lại   Cộng đồng C Việt > LẬP TRÌNH C++ | LẬP TRÌNH C | LẬP TRÌNH C++0X > Thảo luận, góp ý code C/C++ của bạn

Trả lời
 
Các công cụ đề tài Các chế độ hiển thị
  #1  
Cũ 24-02-2009, 09:55 PM
No Avatar
magician1611 magician1611 là offline
Thành viên mới
 
Ngày gia nhập: 01 2008
Bài viết: 2
Mặc định

Thuật toán tìm kiếm nhị phân trên mảng, lỗi không tìm kiếm được?


Bài này là nhập một mảng một chiều , tìm kiếm phần tử x theo nhị phân . Em viết code , phần sắp xếp tăng thì ok , còn phần tìm kiếm ko biết lỗi gì . mấy bro giúp giùm em nhé

#include <stdio.h>
#include <conio.h>

void Nhap_mang(int a[] , int &n)
{
    printf(" Nhap so phan tu mang : ");
    scanf("%d" , &n);
    for(int i = 0 ; i<n ; i++)
    {
        printf("a[%d] = " , i);
        scanf("%d" , &a[i]);
    }
}

void Xuat_mang(int a[] , int n)
{
    for(int i = 0 ; i<n ; i++)
    printf("%d   " , a[i]);
}

void Swap (int &a,int &b)
{
    int t = a;
    a=b;
    b=t;
}


void Sap_xep_tang (int a[] , int n)
{
    int i,j;
    for(i = 0;i<n-1 ; i++)
       for(j = n-1 ; j>i ; j--)
          if(a[j] < a[j-1])
         Swap(a[j] , a[j-1]);
}

int Tim_nhi_phan (int a[] , int n , int x)
{
    int l = 0 , r = n - 1 , k;
    while (l<=r)
    {
        k = (l+r)/2;
        if(a[k] == x)
        return k;
        if(a[k]<x)
        k = l+1;
        else
        k = r-1;
    }
    return -1;
}

void main()
{
    clrscr();
    int a[20],n,x;
    Nhap_mang (a,n);
    printf(" Mang vua nhap : ");
    Xuat_mang (a,n);
    printf("\nMang duoc sap xep tang: ");
    Sap_xep_tang (a,n);
        Xuat_mang(a,n);
    printf("\n Nhap phan tu x can tim : ");
    scanf("%d" , &x);
    int c = Tim_nhi_phan (a,n,x);
    if (c == -1)
    printf("Ko tim thay phan tu %d", x);
    else
        printf("Tim duoc phan tu %d tai vi tri %d" , x , c);
    getch();
}
Trả lời cùng với trích dẫn
  #2  
Cũ 24-02-2009, 10:09 PM
No Avatar
AlexF AlexF là offline
Banned
 
Ngày gia nhập: 02 2008
Bài viết: 1,010
Mặc định

#include <stdio.h>
#include <conio.h>

void Nhap_mang(int a[] , int &n)
{
    printf(" Nhap so phan tu mang : ");
    scanf("%d" , &n);
    for(int i = 0 ; i<n ; i++)
    {
        printf("a[%d] = " , i);
        scanf("%d" , &a[i]);
    }
}

void Xuat_mang(int a[] , int n)
{
    for(int i = 0 ; i<n ; i++)
    printf("%d   " , a[i]);
}

void Swap (int &a,int &b)
{
    int t = a;
    a=b;
    b=t;
}


void Sap_xep_tang (int a[] , int n)
{
    int i,j;
    for(i = 0;i<n-1 ; i++)
       for(j = n-1 ; j>i ; j--)
          if(a[j] < a[j-1])
         Swap(a[j] , a[j-1]);
}

int Tim_nhi_phan (int a[] , int n , int x)
{
    int l = 0 , r = n - 1 , k;
    while (l<=r)
    {
        k = (l+r)/2;
        if(a[k] == x)
            return k;
        else if(a[k]<x)
            r = k-1;
        else
            l = k+1;
    }
    return -1;
}

void main()
{
    int a[20],n,x;
    Nhap_mang (a,n);
    printf(" Mang vua nhap : ");
    Xuat_mang (a,n);
    printf("\nMang duoc sap xep tang: ");
    Sap_xep_tang (a,n);
        Xuat_mang(a,n);
    printf("\n Nhap phan tu x can tim : ");
    scanf("%d" , &x);
    int c = Tim_nhi_phan (a,n,x);
    if (c == -1)
    printf("Ko tim thay phan tu %d", x);
    else
        printf("Tim duoc phan tu %d tai vi tri %d" , x , c);
    getch();
}

bài của bạn triển khai thuật toán bị nhầm ,mình sửa lại rồi

Đã được chỉnh sửa lần cuối bởi AlexF : 25-02-2009 lúc 11:14 AM.
Trả lời cùng với trích dẫn
  #3  
Cũ 24-02-2009, 10:11 PM
Avatar của QuangHoang
QuangHoang QuangHoang là offline
..::SeArCh LoVe::..
 
Ngày gia nhập: 02 2008
Nơi ở: Việt Nam
Bài viết: 578
Mặc định

Tạm sửa như này, bạn test thử xem
Chú ý là trước khi tìm kiếm phải sắp xếp đã.
int Tim_nhi_phan (int a[] , int n , int x)
{
    int l = 0 , r = n - 1 , k;
    while (l<=r)
    {
        k = (l+r)/2;
        if(a[k] == x)
             return k;
        if(x<a[k])
                 r = k-1;
        else
             l = k+1;
    }
    return -1;
}

@Edit: Chậm hơn coder_gate 1 bước
Trả lời cùng với trích dẫn
  #4  
Cũ 24-02-2009, 11:02 PM
No Avatar
magician1611 magician1611 là offline
Thành viên mới
 
Ngày gia nhập: 01 2008
Bài viết: 2
Mặc định

bài sửa của coder_gate sai oi
vẫn ko tìm được x
bạn hoàng code chính xác
thanks các bro nhiều
Trả lời cùng với trích dẫn
  #5  
Cũ 08-06-2011, 06:01 PM
No Avatar
htran6751 htran6751 là offline
Thành viên mới
 
Ngày gia nhập: 03 2011
Bài viết: 1
Mặc định

giúp giùm mình với.mình cũng vik code giải thuật tìm kiếm nhị phân nhưng bị lỗi.chạy ra kết quả không đúng.
#include<iostream.h>
void nhapmang(int a[], int &n)
{
  cout<<"Nhap vao so n: ";cin>>n;
  for (int i=0;i<n;i++)
  {
    cout<<"a["<<i<<"]: ";
    cin>>a[i];
  }
}

void xuatmang(int a[], int n)
{
     cout<<endl;
     for (int i=0;i<n;i++)
      cout<<a[i]<<" ";
}
int tknp(int a[],int s)
{
    int n;
    int i,start=0,end=n,found=0;
    do
    {
        i=(end+start)/2;
        if(a[i]==s)
        found=1;
        else if (a[i]<s)
        start=i+1;
        else if (a[i]>s)
        end=i-1;
    }
    while(!found&&end>=start);
    if(found==1)
    return i+1;
    else
    return 0;
}
void main()
{
    int a;
    int b;
    int x[100];
    int n;
    int s;
    nhapmang(x,n);
    cout<<"mang vua nhap:\n";
    xuatmang(x,n);
    cout<<"nhap vao so can tim";
    cin>>s;
    b=tknp(x,s);
    if(b==0)
    cout<<"khong co";
    else
    cout<<"vi tri "<<b;
   
}
Trả lời cùng với trích dẫn
  #6  
Cũ 01-12-2011, 06:02 PM
No Avatar
nangtienxanhhanhphuc nangtienxanhhanhphuc là offline
Thành viên mới
 
Ngày gia nhập: 11 2011
Bài viết: 4
Mặc định

gợi ý cho bạn


Bạn xem lại thuật toán tìm kiếm của Quanghoang và các phần còn lại của magician1611 nha.Bài của bạn còn thiếu phần sắp xếp.Ak mình không hiểu 1 vấn đề nữa là tại sao khi khai bao tham số cho phần Nhapmang có int &n ???(Bạn nên code đẹp hơn để mọi người dễ nhìn và dễ sửa bài cho bạn)
Trả lời cùng với trích dẫn
  #7  
Cũ 01-12-2011, 07:13 PM
Avatar của clchicken
clchicken clchicken là offline
Thành viên nhiệt tình
 
Ngày gia nhập: 10 2011
Bài viết: 551
Mặc định

Có int &n để bạn ấy muốn nhập n ở trong hàm.
Khi ra khỏi hàm thì n mang giá trị đã bị thay đổi lần cuối cùng ở trong hàm.
__________________
Um Mani Padme Hum...!!
Trả lời cùng với trích dẫn
  #8  
Cũ 16-01-2012, 12:55 PM
Avatar của coolkg1412
coolkg1412 coolkg1412 là offline
Thành viên mới
 
Ngày gia nhập: 07 2010
Bài viết: 16
Mặc định

mình có cái code tìm kiếm nhị phân nè (binary search) bạn thữ xem sao :
giả sữ ta có mảng A có n phần tử, tăng dần cần tìm x trong A

int biSearch (int *_a,int x,int n)
{
    int i = 0;
   
   while (i < n)
   {
       int mid = (i + n) / 2 // Lấy phần tử ở giữa;

       if(_a[mid] <x) n = mid; // nếu x > a[mid] thì tìm trong nữa đầu
       else
            if(_a[mid] > x) i=mid + 1;   // ngược lại tìm trong nữa sau
            else
                 if (_a[mid] == x) return mid; // nếu a[mid]== x trả về vị trí tìm thấy
   }
   
   return -1;  // không tìm thấy trả về -1
}

Đã được chỉnh sửa lần cuối bởi coolkg1412 : 16-01-2012 lúc 01:07 PM.
Trả lời cùng với trích dẫn
  #9  
Cũ 22-05-2012, 03:09 PM
No Avatar
orchidshl1 orchidshl1 là offline
Thành viên mới
 
Ngày gia nhập: 01 2011
Bài viết: 27
Mặc định

rất bổ ích, thanks các bro
Trả lời cùng với trích dẫn
Trả lời
Google
 

Bookmarks

Các công cụ đề tài
Các chế độ hiển thị

Các nguyên tắc gửi bài
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

[IMG] code: On
HTML code: Off

Nhảy tới diễn đàn

Các đề tài tương tự
Đề tài Người bắt đầu đề tài Diễn đàn Các trả lời Bài viết cuối
Các Thuật Toán Sắp Xếp & Tìm Kiếm Trên Mảng cò lã Thủ thuật, Tutorials CTDL & Giải thuật 3 15-11-2011 10:29 AM
slide về các thuật toán sắp xếp và tìm kiếm trên C đây clementboy03 Tài liệu, ebooks và công cụ 14 28-07-2011 10:55 PM
Thuật toán tìm kiếm BFS trên VC++? anhhung90 Thắc mắc lập trình Visual C++ 0 10-10-2010 09:52 PM
Tìm kiếm trên file! Tìm kiếm xâu mẫu dùng giải thuật Naive | Giúp mình code sai ở đâu totoise Thắc mắc lập trình C/C++/C++0x 1 19-04-2009 08:22 PM
giải thuật trên cây nhị phân tìm kiếm?!? gauconchuabityeu Thắc mắc lập trình C/C++/C++0x 3 08-03-2008 06:29 PM


Toàn bộ thời gian tính theo múi GMT +7. Bây giờ là 08:15 AM.