Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并排序实现查询_C#_Algorithm_Sorting_Mergesort - Fatal编程技术网

C# 合并排序实现查询

C# 合并排序实现查询,c#,algorithm,sorting,mergesort,C#,Algorithm,Sorting,Mergesort,我在一个教程网页上在线找到了这个合并排序算法的示例,我一直在试图理解代码是如何实现该算法的。我发现的示例使用递归和临时数组对未排序的算法数组进行排序。 我的查询处于流程的最后一步。将临时数组的元素复制到原始数组中以对数组进行排序时。为什么算法会减少右属性而不是增加左属性?当我增加left-left值时,算法不起作用 class Assignment1 { static void Main(string[] args) { Console.WriteLine("Si

我在一个教程网页上在线找到了这个合并排序算法的示例,我一直在试图理解代码是如何实现该算法的。我发现的示例使用递归和临时数组对未排序的算法数组进行排序。 我的查询处于流程的最后一步。将临时数组的元素复制到原始数组中以对数组进行排序时。为什么算法会减少右属性而不是增加左属性?当我增加left-left值时,算法不起作用

class Assignment1
{
    static void Main(string[] args)
    {
        Console.WriteLine("Size of array:");
        int n = Convert.ToInt16(Console.ReadLine());
        int[] unsorted = new int[n];

        for(int i = 0; i < n; i++)
        {
            Console.WriteLine("Enter a number:");
            unsorted[i] = Convert.ToInt16(Console.ReadLine());
        }

        Console.WriteLine("--------Sort---------");

        Recursion_Sort(unsorted, 0, n - 1);
        for (int i = 0; i < n; i++)
        {
              Console.WriteLine(unsorted[i]);
        }
    }

    static public void Merge(int[] numbers, int left, int mid, int right, int n)
    {

        int[] tempArray = new int[n];

        int i, lEnd, size, pos;



        lEnd = mid - 1;
        pos = left;
        size = (right - left + 1);


        while ((left <= lEnd) && (mid <= right))
        {

            if (numbers[left] <= numbers[mid])
            {

                tempArray[pos] = numbers[left];
                pos++;
                left++;
            }

            else
            {

                tempArray[pos] = numbers[mid];
                pos++;
                mid++;
            }
        }



        while (left <= lEnd)
        {
            tempArray[pos] = numbers[left];
            pos++;
            left++;
        }


        while (mid <= right)
        {
            tempArray[pos] = numbers[mid];
            pos++;
            mid++;
        }
        Console.WriteLine(tempArray.Length);


        for (i = 0; i < size; i++)
        {
            numbers[right] = tempArray[right];
            right--;
        }
    }

    static public void Recursion_Sort(int[] numbers, int left, int right)
    {

        int mid;

        if (right > left)
        {
            mid = (right + left) / 2;


            Recursion_Sort(numbers, left, mid);
            Recursion_Sort(numbers, (mid + 1), right);
            // we then merge the sorted sub arrays using the merge method
            Merge(numbers, left, (mid + 1), right, numbers.Length);
        }
    }
}
类分配1
{
静态void Main(字符串[]参数)
{
Console.WriteLine(“数组大小:”);
int n=Convert.ToInt16(Console.ReadLine());
int[]未排序=新的int[n];
对于(int i=0;i虽然((左冒着不回答您想要的问题的风险,但我建议LINQ。这不是特别的合并排序,而是两个数组的串联,然后排序

如果您的阵列不是太大以至于性能不重要,那么您可能希望采用这种方法,因为它简单且代码更少(这总是好的)


此外,如果其他人对此感兴趣,我会发布此消息。

left
值在合并过程中发生变化,因为您有代码块


虽然(左)谢谢@FireAlkazar,这很有道理,但最终还是明白了发生了什么
int[] arr1 = new[] { 1, 2, 3, 7, 8, 10 };
int[] arr2 = new[] { 4, 6, 9, 12, 15 };

int[] merged = arr1.Concat(arr2).OrderBy(n => n).ToArray();