冒泡排序不起作用

时间:2016-11-20 10:23:30

标签: c# winforms bubble-sort

目前用户能够在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));
    }
}

2 个答案:

答案 0 :(得分:0)

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

这会将bubbleUp设置为true,表示已在列表框中进行交换。此变量用于指示在上次比较中已进行/尚未进行交换。输入while(bubbleUp)bubbleUp设置为false表示没有进行掉期。然后循环遍历列表框中的每个项目以比较相邻项目并在需要时进行交换。如果进行了交换,bubbleUp将设置为true,表示排序尚未完成。只需要在for循环中设置bubbleUp一次,以指示需要进行另一次迭代。 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();
}

答案 1 :(得分:0)

这更像是冒泡排序算法:

    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++;
                }
            }
        }
    }

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