合并排序二维数组c#

时间:2021-05-01 09:22:31

标签: c# mergesort

我的任务是在 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 个答案:

答案 0 :(得分:0)

最直接的方法就是替换

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 值融合为一个 long 值并将其排序为一维数组。但它需要额外的步骤。

相关问题