线性搜索问题

Posted

技术标签:

【中文标题】线性搜索问题【英文标题】:Linear Search Problem [closed] 【发布时间】:2011-08-30 16:13:16 【问题描述】:

我的程序没有编译错误,但输出不正确。示例输入:

数组大小:5 输入数字:5 4 3 2 1 //排序:1 2 3 4 5 搜索:1 输出:在索引 4 处找到的数字 1

输出应该是在索引 0 处找到的数字 1,因为这些数字已经排序。我将如何将其更改为这个。

    int[] nums = new int[100];
    int SizeNum;
    bool isNum = false;

    private void ExeButton_Click(object sender, EventArgs e)
    
        int i, loc, key;
        Boolean found = false;
        string SizeString = SizeTextBox.Text;
        isNum = Int32.TryParse(SizeString, out SizeNum);
        string[] numsInString = EntNum.Text.Split(' ');   //split values in textbox
        for (int j = 0; j < numsInString.Length; j++)
        
            nums[j] = int.Parse(numsInString[j]);
        
        if (SizeNum == numsInString.Length)
        
            Array.Sort(numsInString);
            key = int.Parse(SearchTextBox.Text);
            ResultText.AppendText("Sorted: ");
            for (i = 0; i < SizeNum; i++)
                ResultText.AppendText(" " + numsInString[i]);
                 ResultText.AppendText("\n\n");
            
                for (loc = 0; loc < SizeNum; loc++)
                
                    if (nums[loc] == key)
                    
                        found = true;
                        break;
                    
                
                if (found == true)
                    ResultText.AppendText("Number " + key + " Found At Index [" + loc + "]\n\n");
                else
                    ResultText.AppendText("Number " + key + " Not Found!\n\n");
            
        
    

【问题讨论】:

这看起来不像线性搜索。 你的程序显然确实有一个错误,因为它没有按照你的意愿去做...... 它看起来很像线性搜索。最后一部分。但是,Sort() 不是必需的,如果您想要输入数据中的位置,这是错误的。 【参考方案1】:

您正在排序 numsInString,但随后搜索 numsnums 在搜索之前被填充,因此您会看到搜索未排序数字的结果。

numsInStrings 解析为nums 后,您应该只使用后一个数组。确保这是您正在排序和搜索的那个。

换句话说,一旦将当前排序调用替换为

Array.Sort(nums);

你的代码会很好。

更新

你实际上需要另一个修复。现在,您将 nums 初始化为大小为 100 的数组。默认情况下,每个元素都是 0。因此,即使您将数字放在前五个元素中,当您对数组进行排序时,您最终会得到 95 0,后跟 1 2 3 4 5。

您应该延迟初始化nums,直到您看到numsInString 有多大:

string[] numsInString = EntNum.Text.Split(' ');   //split values in textbox
nums = new int[numsInString.Length];

for (int j = 0; j < numsInString.Length; j++)

    nums[j] = int.Parse(numsInString[j]);

现在,当您对nums 进行排序时,您只会看到您输入的数字。

【讨论】:

那你正在排序字符串数组而不是 int 数组,我认为这不是你打算做的。 @crlanglous 对;将排序更改为nums 数组可以解决这两个问题。 那是我的第一选择。数组.排序(数字);。但它显示零。然后我把它改成 NumInstring。 现在可以正确显示了。这就是为什么我看到很多零。我在我的代码上遗漏了一些东西。谢谢dlev​​。【参考方案2】:

您正在对numsInString 数组进行排序,但仍在搜索nums 数组。

for (loc = 0; loc < SizeNum; loc++)

    if (numsInString[loc] == key)
    
        found = true;
        break;
    

【讨论】:

【参考方案3】:

您正在解析numsInString 然后您正在对其进行排序。 (我怀疑这种排序也不会做你想做的事。)

我认为你真的想对nums 进行排序:

Array.Sort(nums);

话虽如此,有更简单的方法可以实现最终结果 - 例如使用IndexOf 查找数组中某个值的索引。

也不清楚你为什么在这里戴牙套:

for (i = 0; i < SizeNum; i++)
    ResultText.AppendText(" " + numsInString[i]);
    ResultText.AppendText("\n\n");

    ...

这使得它看起来就像你有一个带有身体的循环,但它实际上相当于:

for (i = 0; i < SizeNum; i++)

    ResultText.AppendText(" " + numsInString[i]);

ResultText.AppendText("\n\n");

    ...

...大括号在这里没有任何作用,只会损害可读性。

【讨论】:

以上是关于线性搜索问题的主要内容,如果未能解决你的问题,请参考以下文章

我的二进制搜索和线性搜索的问题[关闭]

二元和线性搜索

如何使用伪代码开发线性搜索和二分搜索算法。?

二分搜索与线性搜索奇怪的时间

为啥我们不能在跳转搜索中使用二分搜索而不是线性搜索?

线性和二进制搜索