【问题标题】:Bubble sort is not working冒泡排序不起作用
【发布时间】:2017-04-03 19:55:15
【问题描述】:

目前用户可以在 ListBox 中输入数字,并且我希望 ListBox 在单击排序检查按钮时按下面的冒泡排序进行排序。但是,它只输出索引号,例如0,1,2,3...我不允许仅使用 items 属性以及解析和转换的任何数组或容器。

private void sorted()
{
    int a = Convert.ToInt32(lstHoldValue.Items.Count);
    int temp;
    for (int i = 0; i < a; i++)
    {
        for (int j = i + 1; j < a; j++)
        {
            if (Convert.ToInt32(lstHoldValue.Items[i]) >
                Convert.ToInt32(lstHoldValue.Items[j]))
            {
                temp = Convert.ToInt32(lstHoldValue.Items[i]);
                (lstHoldValue.Items[i]) = Convert.ToInt32(lstHoldValue.Items[j]);
                (lstHoldValue.Items[j]) = temp;
            }
        }
    }

    lstHoldValue.Items.Clear();
    for (int i = 0; i < a; i++)
    {
        Convert.ToInt32(lstHoldValue.Items.Add("\t" + i));
    }
}

【问题讨论】:

  • 好吧,最后你清除你的列表,然后开始将索引从 i 添加到 a。最后一个 for 循环到底想做什么?
  • 您正在清除列表框(因此在此过程中会丢失它的值)并添加循环索引(最后一个循环中的 i );还有Items.Count已经是int,不需要转换
  • 我认为算法也是错误的-冒泡排序意味着只要您不更改顺序就可以查看集合;您正在循环收集一次,然后在集合的内部循环中休息 - 它似乎不是冒泡排序的正确实现。
  • 是的,抱歉,我的本意是要删除 clear() 行。如果我这样做,它只会显示索引号 0,1,2,3,.. 等。我只是不确定如何在不使用任何容器或数组的情况下对列表框进行排序,只使用列表框项属性。跨度>

标签: c# winforms bubble-sort


【解决方案1】:

如果 ListBox 中的项目不是整数,则将其排序为零 (0)。

这会将bubbleUp 设置为true,表示已在列表框中进行了交换。此变量用于指示在上次比较中是否进行了交换。输入while(bubbleUp)bubbleUp 设置为false,表示没有进行任何交换。然后循环遍历列表框中的每个项目以比较相邻项目并在需要时进行交换。如果进行了交换,bubbleUp 将设置为true,表示排序未完成。 bubbleUp 只需要在 for 循环中设置一次,以指示需要进行另一次迭代。 CheckItem 是从字符串到整数的转换。希望这会有所帮助。

private void sorted()
{
  bool bubbleUp = true;
  string temp = "";
  while (bubbleUp)
  {
    // bubble up adjacent values
    bubbleUp = false;
    for (int i = 0; i < _ListBox.Items.Count - 1; i++)
    {
      if (CheckItem(_ListBox.Items[i].ToString()) > CheckItem(_ListBox.Items[i + 1].ToString()))
      {
        temp = _ListBox.Items[i].ToString();
        _ListBox.Items[i] = _ListBox.Items[i + 1];
        _ListBox.Items[i + 1] = temp;
        bubbleUp = true;
      }
    }
  }
}

private int CheckItem(string inItem)
{
  int value;
  if (int.TryParse(inItem, out value))
    return value;
  return 0; 
}

private void button1_Click(object sender, EventArgs e)
{
  sorted();
}

【讨论】:

    【解决方案2】:

    这更像是一个冒泡排序算法:

        private void BubbleSort()
        {
            int a = lstHoldValue.Items.Count;
            for (int i = 0; i < a - 1; i++)
            {
                var k = 0;
                for(var j = 1; j < a - i; j++)
                {
                    if (Convert.ToInt32(lstHoldValue.Items[j]) < Convert.ToInt32(lstHoldValue.Items[k]))
                    {
                        var temp = lstHoldValue.Items[j];
                        lstHoldValue.Items[j] = lstHoldValue.Items[k];
                        lstHoldValue.Items[k] = temp;
                        k = j;
                    }
                    else
                    {
                        k++;
                    }
                }
            }
        }
    

    它将对您的lstHoldValue listBox 控件的Items 集合中的数字进行排序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 2014-12-30
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      相关资源
      最近更新 更多