簡體   English   中英

如何修復C#二進制搜索算法?

[英]How do i fix my c# binary search algorithm?

我正在嘗試在程序中實現一個二進制搜索算法,但它似乎沒有用。

這是我的代碼:

public static void Search(float[] array, float key)
    {
        int min = 0; 
        int max = array.Length - 1;
        int mid = 0;

        do
        {
            mid = (min + max) / 2;

            if (key > array[mid])
            {
                min = mid + 1; 
            }

            if (key < array[mid])
            {
                max = mid - 1; 
            }

            if (key == array[mid])
                Console.WriteLine($"The item, {key} was found at index {mid} of the array");
        } while (min <= max);

(我正在使用的數組已排序)我只是得到一個空白的控制台,而且似乎從未找到結果。 我該如何解決?

謝謝

更新:我已經從txt文件創建了float [],如下所示:

float[] floats = (File.ReadAllLines(@"floats.txt")).Where(s => s != String.Empty).Select(s => float.Parse(s)).ToArray();

這是floats.txt的內容(鏈接到pastebin)

這是用於測試算法是否有效的行:

Search(floats, -2.4439f);

(此外,在嘗試搜索數組之前,我先對其進行了排序)

使用您提供的輸入文件,此代碼實際上對我有用。 我的猜測是您不是先對數組排序:

    static void Main(string[] args)
    {
        // Read in floats from input file
        var lines = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "input.txt"));
        var floats = new List<float>();
        foreach (var l in lines)
        {
            if (float.TryParse(l, out var result))
            {
                floats.Add(result);
            }
        }

        var array = floats.OrderBy(f => f).ToArray();
        float key = -2.4439f;

        Search(array, key);
    }

    public static void Search(float[] array, float key)
    {
        int min = 0;
        int max = array.Length - 1;
        int mid = 0;

        do
        {
            mid = (min + max) / 2;

            if (key > array[mid])
            {
                min = mid + 1;
            }

            if (key < array[mid])
            {
                max = mid - 1;
            }

            Console.WriteLine($"Checking {array[mid]}");
            if (key == array[mid])
            {
                Console.WriteLine($"The item, {key} was found at index {mid} of the array");
                break;
            }
        } while (min <= max);
    }

這是輸出:

The item, -2.4439 was found at index 146 of the array  

二進制搜索是遞歸函數的理想選擇。 也許您可以嘗試這樣的事情:

public static void Search(float[] array, float key, int? min = null, int? max = null)
    {
        if (!min.HasValue)
        {
            min = 0;
        }
        if (!max.HasValue)
        {
            max = array.Length - 1;
        }

        Console.WriteLine(string.Format("Searching from {0} to {1}", min.Value, max.Value));

        if (min.Value >= max.Value)
        {
            if (array[min.Value] == key)
            {
                Console.WriteLine(string.Format("The item, {0} was found at index {1} of the array", key, min.Value));
            }
        }
        else
        {
            int mid = (max.Value - min.Value) / 2;
            if (mid < 1)
            {
                mid = 1;
            }
            Search(array, key, min, min.Value + mid - 1);
            Search(array, key, min.Value + mid, max);
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM