0

クラスの割り当てを行ってい
ます。乱数の2D配列を作成し、バブルまたは他の並べ替えコードで並べ替える必要があります。単一の配列で問題ありませんが、問題は乱数で満たされた2D配列であり、取得できません。乱数は、ユーザー入力の(-I、I)間隔で作成する必要があります。英語が下手でごめんなさい、学位を取得していません。Visual C#ウィンドウフォームでの作業。シンプルなカップルシクルメソッドを探しています。例。:A[MxN] ->>> B[MxN] (Sorted 1.....n)

4

2 に答える 2

0

最初に各行の列を順番にソートし、次に各行を最初の列、次に2番目などで比較するソリューションを次に示します。

namespace StackOverflow.Demos
{

    class Program
    {

        public static void Main(string[] args) 
        {
            new Program();
            Console.WriteLine("Done");
            Console.ReadKey();
        }
        Program()
        {
            double[,] data = GenerateData();
            OutputData(data, "Before");
            SortData(ref data);
            OutputData(data, "After");
        }
        double[,] GenerateData()
        {
            Random randomGenerator = new Random(DateTime.UtcNow.Millisecond);
            double[,] data = new double[5, 5];
            for (int i = 0; i < data.GetLength(0); i++)
            {
                for (int j = 0; j < data.GetLength(1); j++)
                {
                    data[i, j] = (randomGenerator.NextDouble() * 2) - 1;
                }
            }
            return data;
        }
        void OutputData(double[,] data, string message)
        {
            Console.WriteLine("=====================");
            Console.WriteLine(message);
            Console.WriteLine("=====================");
            for (int i = 0; i < data.GetLength(0); i++)
            {
                for (int j = 0; j < data.GetLength(1); j++)
                {
                    Console.Write(data[i, j]);
                    Console.Write("\t");
                }
                Console.WriteLine();
            }
        }
        void SortData(ref double[,] data)
        {
            //sort sub arrays
            SortDataRows(ref data);
            //sort this array
            for (int i = 0; i < data.GetLength(0)-1; i++)
            {
                for (int j = i; j < data.GetLength(0); j++)
                {
                    for (int k = 0; k < data.GetLength(1); k++)
                    {
                        if (data[i, k].CompareTo(data[j, k]) < 0) //if already in order exit loop
                        {
                            break;
                        } else if (data[i, k].CompareTo(data[j, k]) > 0) //if out of order switch and loop
                        {
                            SwapRows(ref data, i, j);
                            break;
                        }//else orders are equal so far; continue to loop
                    }
                }
            }
        }
        void SortDataRows(ref double[,] data)
        {
            for (int row = 0; row < data.GetLength(0); row++)
            {
                for (int i = 0; i < data.GetLength(1) - 1; i++)
                {
                    for (int j = i; j < data.GetLength(1); j++)
                    {
                        if (data[row, i].CompareTo(data[row, j]) > 0)
                        {
                            Swap<double>(ref data[row, i], ref data[row, j]);
                        }
                    }
                }
            }
        }
        void Swap<T>(ref T a, ref T b)
        {
            T temp = a;
            a = b;
            b = temp;
        }
        void SwapRows(ref double[,]data, int i, int j)
        {
            for (int k = 0; k < data.GetLength(1); k++)
            {
                Swap<double>(ref data[i, k], ref data[j, k]);
            }
        }
    }

}

コードは最高ではありません (まだお茶を飲んでいません) が、目的のコードを実行する必要があります。

これはより良い解決策です(2D配列をそのまま使用するのではなく、そのような配列との間で簡単に変換できる構造を使用します):

System.Diagnostics を歌います。

namespace StackOverflow.Demos
{

    class Program
    {

        public static void Main(string[] args) 
        {
            new Program();
            Console.WriteLine("Done");
            Console.ReadKey();
        }
        Program()
        {
            List<List<double>> data = GenerateData(5, 5).ToList<List<double>>();
            OutputData(data,"Before");
            foreach (List<double> item in data)
            {
                item.Sort();
            }
            data.Sort(CompareListOfDoubles);
            OutputData(data,"After");
        }

        private IEnumerable<List<double>> GenerateData(int index1, int index2)
        {
            Random rnd = new Random(DateTime.UtcNow.Millisecond);
            List<double> result;
            for (int i = 0; i < index1; i++)
            {
                result = new List<double>(index2);
                for (int j = 0; j < index2; j++)
                {
                    result.Add(rnd.NextDouble() * 2 - 1);
                }
                yield return result;
            }
        }
        private void OutputData(List<List<double>> data, string message)
        {
            Console.WriteLine(message);
            foreach (List<double> list in data)
            {
                foreach (double datum in list)
                {
                    Console.Write(datum);
                    Console.Write("\t");
                }
                Console.WriteLine();
            }
        }
        static int CompareListOfDoubles(List<double> a, List<double> b)
        {
            for (int i = 0; i < a.Count; i++)
            {
                if (i > b.Count) return -1;
                if (a[i] > b[i]) return -1;
                if (a[i] < b[i]) return 1;
            }
            if (b.Count > a.Count) return 1;
            return 0;
        }
        double[,] ConvertListListDoubleTo2DArray(List<List<double>> data)
        {
            double[,] result = new double[data.Count, data[0].Count];
            for (int i = 0; i < result.GetLength(0); i++)
            {
                for (int j = 0; j < result.GetLength(1); j++)
                {
                    result[i, j] = data[i][j];
                }
            }
            return result;
        }
    }
于 2012-12-02T12:09:53.543 に答える
0

乱数を取得するのは簡単です:

Random rnd;

for (int y = 0; y < h; y++)
    for (int x = 0; x < w; x++)
        array[y][x] = l - rnd.Next(2 * l + 1);

Random.Next()0 と指定されたパラメーターの間のランダムな値を返します (パラメーターを除く。これが の理由です+ 1)。

2D 配列は 1D 配列と同じように並べ替えることができます。複数の行をどのように処理するかによってのみ異なります。たとえば、単に表示するか、すべての行を並べ替えるかなどです。

于 2012-12-02T11:25:11.973 に答える