2011-11-09 76 views
7

Tôi đang cố tìm kiếm một mảng sắp xếp giảm dần bằng mã tìm kiếm nhị phân này. Tuy nhiên, sau khi tôi sắp xếp nó, và cố gắng tìm kiếm, nó không trở lại với bất kỳ kết quả nào, chỉ là một biểu tượng tải không bao giờ biến mất như thể nó có một vòng lặp vô hạn. Tôi không chắc vấn đề là vì mã có vẻ hợp lý.Tìm kiếm nhị phân của mảng được sắp xếp

Đây là aspx với khung 4.0, C#. Cảm ơn trước!

protected void Button2_Click(object sender, EventArgs e) 
    { 
     String item = TextBox1.Text; 
     int target = Convert.ToInt16(item); 
     int mid, first = 0, last = mynumbers.Length - 1; 

     //for a sorted array with descending values 
     while (first<=last) 
     { 
      mid = (first + last)/2; 
      if (target < mynumbers[mid]) 
       first = mid + 1; 
      if (target > mynumbers[mid]) 
       last = mid - 1; 
      else 
       Label11.Text = "Target " + item + " was found at index " + mynumbers[mid]; 

     } 
+0

Tôi nghĩ ... nó phải là 'đầu tiên

Và trên thực tế, tôi d lẽ thiết lập một lá cờ bool thay vì để giữ cho các thuật toán tinh khiết và không kết hợp tìm với những mối quan tâm đầu ra, điều này cũng sẽ làm cho nó dễ dàng hơn để biết những gì xảy ra nếu bạn thoát khỏi vòng lặp với không tìm thấy:

bool found = false; 

    //for a sorted array with descending values 
    while (!found && first<=last) 
    { 
     mid = (first + last)/2; 

     if (target < mynumbers[mid]) 
     { 
      first = mid + 1; 
     } 

     if (target > mynumbers[mid]) 
     { 
      last = mid - 1; 
     } 

     else 
     { 
      // You need to stop here once found or it's an infinite loop once it finds it. 
      found = true; 
     } 
    } 

    Label11.Text = found 
     ? "Item " + item + " was found at position " + mid 
     : "Item " + item + " was not found"; 
+0

Cảm ơn bạn đã trả lời, vâng nó phải là tìm kiếm tùy chỉnh –

+0

Mảng của OP được sắp xếp thứ tự giảm dần. Tôi đoán đó là lý do tại sao họ tự làm. (Ngoài ra, bạn không cần phải gọi một cách rõ ràng quá tải chung: thuật toán kiểu-inferencing sẽ tự động chọn phương thức thích hợp nhất - tức là, quá tải gõ mạnh nhất.) – LukeH

+0

@LukeH: Vâng, tôi đã thêm vào vặn xoắn. Nếu OP cần tùy chỉnh vì giảm dần, anh ta chỉ cần một 'ReverseComparer ' đó là một mục hộp công cụ tốt anyway. Tuy nhiên, nếu đó là một bài tập học thuật, anh ta cần mã tùy chỉnh. –

0

Shot trong bóng tối:

if (target < mynumbers[mid]) 
    first = mid + 1; 
else if (target > mynumbers[mid]) 
    last = mid - 1; 
else 
{ 
    .... 
    break; 
} 

tôi nghi ngờ bạn đang nảy qua lại giữa mid + 1 và mid-1

+0

Xin cảm ơn, điều đó khiến tôi thoát khỏi vòng lặp của tôi. Cảm kích điều đó! Bây giờ tôi nghĩ rằng tôi chỉ cần phải làm việc ra các lỗi của các chỉ số của tôi bây giờ. Cảm ơn! –

0

Đây là một chính xác:

nếu target< mynumbers[mid] sau đó bạn phải mất ngoái đến giữa 1, vì chúng ta phải tìm kiếm trong phạm vi tức là thấp đầu tiên đến giữa-1

while (first<=last) 
     { 
      mid = (first + last)/2; 
      if (target == mynumbers[mid]) 
      Label11.Text = "Target " + item + " was found at index " + mynumbers[mid]; 

      else if (target < mynumbers[mid]) 
       last = mid - 1; 
      else (target > mynumbers[mid]) 
       first = mid + 1; 

      } 
0
//this works fine with these Test cases  
// has to check if (target == mynumbers[mid])  
// this is for an array with ascending order. 
class Program 
{ 

    static void Main(string[] args) 
    { 
     // TEST cases: 
     // for 8: item 8 was not found 
     // for 4: item 4 found at Position 3 
     // for 1: item 1 found at position 0 
     // for 0: item 0 was not found 


     int target =8; 
     int searchkey = target; 

     int[] mynumbers = { 1, 2, 3, 4, 5 }; 

     int mid=0, first = 0, last = mynumbers.Length - 1; 

     bool found = false; 

     //for a sorted array with ascending values 
     while (!found && first <= last) 
     { 
      mid = (first + last)/2; 

      if (target == mynumbers[mid]) 
       found = true; 
      else 
      { 

       if (target > mynumbers[mid]) 
       { 
        first = mid + 1; 
       } 

       if (target < mynumbers[mid]) 
       { 
        last = mid - 1; 
       } 

      } 

     } 

     String foundmsg = found 
      ? "Item " + searchkey + " was found at position " + mid 
      : "Item " + searchkey + " was not found"; 
     Console.WriteLine(foundmsg); 
    } 
} 
0

của nó làm việc f hoặc tôi

public static int search(int[] arr, int value) 
{ 
    Debug.Assert(arr.Length>0); 
    var left = 0; 
    var right = arr.Length - 1; 

    while (((right - left)/2) > 0) 
    { 
     var middle = left + (right - left)/2; 
     if (arr[middle] < value) 
      left = middle + 1; 
     else 
      right = middle; 
    } 
    return arr[left] >= value ? left : right; 
} 
Các vấn đề liên quan