使用Gnome排序算法对随机数列表进行排序的Windows窗体应用程序

本文关键字:排序 Windows 窗体 应用程序 列表 Gnome 算法 随机数 使用 | 更新日期: 2023-09-27 17:54:05

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            FillArray();
        }
        private void FillArray() { Random rnd = new Random(); 
            for (int i = 0; i < 29; i++) { myArray[i] = rnd.Next(1, 100); } } 

        // Array of random integers
        static int max = 29;
        int[] myArray = new int[max];
        private void Form1_Load(object sender, EventArgs e)
        {
        }
        private void btnOne_Click(object sender, EventArgs e)
        {
            int temp = 0;
            for (int outer = 0; outer < max; outer++)
            {
                for (int i = 0; i < max - 1; i++)
                {
                    if (myArray[i] > myArray[i + 1])
                    {
                        // Swap routine
                        temp = myArray[i + 1];
                        myArray[i + 1] = myArray[i];
                        myArray[i] = temp;
                    }
                    ShowArray();
                    Thread.Sleep(100);
                }
            }
        }
                   private void ShowArray()
                   {
                   listBox1.Items.Clear();
                   for (int i = 0; i < max; i++)
 {
                   listBox1.Items.Add(myArray[i]);
 }
 }
    }
                }

//你好,我想完成这个,但是有麻烦。我甚至不确定我是否走对了路。任何帮助都会很感激。问题是:创建一个Windows窗体应用程序,该应用程序通过使用对随机数列表排序侏儒排序算法。程序必须使用一个包含29个整数的数组。后每次迭代,程序都必须显示数组。重要:swap例程必须在使用参数的单独方法中

使用Gnome排序算法对随机数列表进行排序的Windows窗体应用程序

这是快速和肮脏的代码。我在一个新任务中启动侏儒排序,以便GUI在排序期间不会冻结。ShowArray将使用Invoke调用,以避免CrossThreadException。先看一下:

// Array of random integers
private const int MAX = 29;
private readonly int[] myArray = new int[MAX];
private void btnOne_Click(object sender, EventArgs e)
{
  FillArray();
  // Using Task to avoid GUI freeze
  Task.Factory.StartNew(() =>
  {
    for (var outer = 0; outer < MAX; outer++)
    {
      for (var inner = 0; inner < MAX - 1; inner++)
      {
        if (myArray[inner] > myArray[inner + 1])
        {
          Swap(ref myArray[inner + 1], ref myArray[inner]);
        }
        ShowArray();
        Thread.Sleep(50);
      }
    }
  });
}
private void FillArray()
{
  var random = new Random();
  for (var i = 0; i < MAX; i++)
  {
    myArray[i] = random.Next(1, 100);
  }
}
private void ShowArray()
{
  // Using Invoke to avoid CrossThreadException
  Invoke(new MethodInvoker(delegate
  {
    listBox1.Items.Clear();
    for (var i = 0; i < MAX; i++)
    {
      listBox1.Items.Add(myArray[i]);
    }
  }));
}
private static void Swap(ref int var1, ref int var2)
{
  var temp_value = var1;
  var1 = var2;
  var2 = temp_value;
}