当前位置: 首页 > 知识库问答 >
问题:

合并排序二维数组C#

岑叶秋
2023-03-14

我的任务是用C#为二维数组创建合并排序算法。数组看起来像这样

X1 Y1
X2 Y2
…
Xn Yn

我需要从文件中取数组并按x的升序对行进行排序,同时程序要检查是否有相同x值同时不同Y值的坐标对,当数组排序后,程序要将其写入文件中。我已经为一维数组创建了算法,但是不懂如何为二维数组重写算法,这是我的代码,请帮助我

using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;

class Program
{
    //array merging
    static void Merge(int[] num, int lowIndex, int middleIndex, int highIndex)
    {
        var left = lowIndex;
        var right = middleIndex + 1;
        var tempArray = new int[highIndex - lowIndex + 1];
        var index = 0;

        while ((left <= middleIndex) && (right <= highIndex))
        {
            if (num[left] < num[right])
            {
                tempArray[index] = num[left];
                left++;
            }
            else
            {
                tempArray[index] = num[right];
                right++;
            }

            index++;
        }

        for (var j = left; j <= middleIndex; j++)
        {
            for (var i=0;;) {
                tempArray[index] = num[j];
                index++; }
        }

        for (var j = right; j <= highIndex; j++)
        {
            for (var i = 0; ;)
            {
                tempArray[index] = num[j];
                index++;
            }
        }

        for (var j = 0; j < tempArray.Length; j++)

        {
            for(var i=0; ;)
            { 
            num[lowIndex + j] = tempArray[j];
                }
        }
    }

    //merge sorting
    static int[] MergeSort(int[] num, int lowIndex, int highIndex)
    {
        if (lowIndex < highIndex)
        {
            var middleIndex = (lowIndex + highIndex) / 2;
            MergeSort(num, lowIndex, middleIndex);
            MergeSort(num, middleIndex + 1, highIndex);
            Merge(num, lowIndex, middleIndex, highIndex);
        }

        return num;
    }

    public static int[] MergeSort(int[] num)
    {
        return MergeSort(num, 0, num.Length - 1);
        
    }

    static void Main(string[] args)
    {
        Console.WriteLine("Merge sorting");
        string[] lines = File.ReadAllLines(@"C:\Users\glebk\source\repos\ConsoleApp18\ConsoleApp18\file.txt");
         int[,] num = new int[lines.Length, lines[0].Split(' ').Length];
        for (int i = 0; i < lines.Length; i++)
        {
            string[] temp = lines[i].Split(' ',',');
            for (int j = 0; j < temp.Length; j++)
            {
                num[i, j] = Convert.ToInt32(temp[j]);
                Console.Write(num[i, j]+" ");

                
            }
            Console.ReadKey();
        }

        Console.WriteLine("Sorted array: {0}", string.Join(",", MergeSort(num)));

    }

}`

共有1个答案

康言
2023-03-14

最直接的方法是替换

tempArray[index] = num[left];

用这样的东西

static void CopyLine(int[,] destArr, int destIndex, int[,] sourceArr, int sourceIndex)
{
    for (int i = 0; i < destArr.GetLength(1); ++i)
    {
        destArr[destIndex, i] = sourceArr[sourceIndex, i];
    }
}

这是全部代码

static void CopyLine(int[,] destArr, int destIndex, int[,] sourceArr, int sourceIndex)
{
    for (int i = 0; i < destArr.GetLength(1); ++i)
    {
        destArr[destIndex, i] = sourceArr[sourceIndex, i];
    }
}


//array merging
static void Merge(int[,] num, int lowIndex, int middleIndex, int highIndex)
{
    var left = lowIndex;
    var right = middleIndex + 1;
    var tempArray = new int[highIndex - lowIndex + 1, num.GetLength(1)];
    var index = 0;

    while ((left <= middleIndex) && (right <= highIndex))
    {
        if (num[left, 0] < num[right, 0])
        {
            CopyLine(tempArray, index, num, left);
            left++;
        }
        else
        {
            CopyLine(tempArray, index, num, right);
            right++;
        }

        index++;
    }

    for (var j = left; j <= middleIndex; j++)
    {
        CopyLine(tempArray, index, num, j);
        index++;
    }

    for (var j = right; j <= highIndex; j++)
    {
        CopyLine(tempArray, index, num, j);
        index++;
    }

    for (var j = 0; j < tempArray.GetLength(0); j++)
    {
        CopyLine(num, lowIndex + j, tempArray, j);
    }
}

//merge sorting
static void MergeSort(int[,] num, int lowIndex, int highIndex)
{
    if (lowIndex < highIndex)
    {
        var middleIndex = (lowIndex + highIndex) / 2;
        MergeSort(num, lowIndex, middleIndex);
        MergeSort(num, middleIndex + 1, highIndex);
        Merge(num, lowIndex, middleIndex, highIndex);
    }
}

public static void MergeSort(int[,] num)
{
    MergeSort(num, 0, num.GetLength(0) - 1);
}

static void WriteArray(string description, int[,] arr)
{
    Console.WriteLine(description);
    for (int i = 0; i < arr.GetLength(0); i++)
    {
        for (int j = 0; j < arr.GetLength(1); j++)
        {
            Console.Write(arr[i, j] + " ");
        }
        Console.WriteLine();
    }
    Console.WriteLine();
}

static void Main(string[] args)
{
    int[,] num = new int[,] { { 3, 5 }, { 1, 10 }, { 7, 3 }, { 2, 1 }, { 5, 2 } };
    WriteArray("Original array:", num);
    MergeSort(num);
    WriteArray("Sorted array:", num);
    Console.ReadKey();
}

还有其他选项,您可以将两个int值融合为一个长值,并将其排序为1D数组。但还需要采取更多的步骤。

 类似资料:
  • 问题内容: 我已经实现了冒泡排序来对二维java long [] []进行排序,但是我的天哪太慢了,我将需要禁食算法,因为我将生成最大堆大小的数组,jvm将允许我, 所以我认为最好和最快的方法是使用内置的java Arrays.sort 我不介意它是否只能在第一列上排序,因为我可以更改程序以适合它,但我碰到了这一点,但对陌生人并不熟悉, 这将使我能够对整数的维数组进行排序,有人知道如何将其更改为允

  • 编写一个程序,提示用户输入一个双值nxn矩阵,并显示一个新的矩阵,其中对初始矩阵的列进行了排序。您可以使用任何排序算法来解决问题;请在代码头中指定所用排序算法的名称。您的程序必须实现排序算法;不能使用Array类中提供的排序方法。排序应该实现到一个方法中,其中返回一个新数组,而原始数组保持不变: 该程序还应该实现一个方法,打印初始和结果矩阵给用户。打印出来的应该是很好的格式。下面是一个运行示例:

  • 原数据: 根据arr数组里面的price字段排序 期望得到: 麻烦各位大佬帮我看看

  • 问题是关于从16:43到23:34的视频中的合并排序http://youtu.be/M814OagXWTI?t=16m43s 在退出左/右排序合并递归后,我不清楚我们是如何合并回这些子数组的。让我们从最底部开始,当我们的元素被分成两个子数组时,一个左子数组称为B,一个右子数组称为C。在16:43左右,我们跳转到合并函数,对数组B和C进行排序,这两个数组只有8和3。合并排序函数(下面的代码)基本上通

  • 我正在玩排序数组,我弄清楚了如何对int数组进行合并排序。但是我不知道合并字符串数组。在正常排序时,对字符串数组进行排序很容易,但合并排序不同。我到目前为止所做的代码如下,正在处理int数组。

  • 问题内容: 给定两个排序数组,如下所示: 我希望输出为: 要么: 我知道我可以执行以下操作: 我只是想知道是否有一种更快的方法,因为我要处理的数组具有数百万个元素。 任何想法都欢迎。谢谢 问题答案: 由于您使用numpy,因此我怀疑bisec根本不会对您有所帮助。因此,我建议您做两件事: 千万 不能 使用,使用方法,而不是这种种取代阵列,避免了复制。 必须使用没有到位的。因此,不要手动使用逻辑。I