查找和修复方法问题

时间:2014-09-21 17:14:32

标签: c# sorting

我目前正在进行一项任务,我需要在程序中找到阻止其执行的错误。它是一个比较排序程序,有两种排序方法,Merge Sort和Counting Sort。它给了我"没有重载(插入方法),需要1个参数"消息,但我无法找到或修复错误的内容,任何一般性的想法或修复方法都可以使比较工作受到赞赏。

using System;
using System.Collections;
namespace Sort
{
class Program
{
    static void Main(string[] args)
    {
        Random rdm = new Random();
        ArrayList data = new ArrayList();
        ArrayList dataB = new ArrayList();
        int size = 50000;
        int[] dta = new int[size];
        int[] dta50 = new int[50];
        int randomNum;
        DateTime startTime, endTime;
        int i;
        // Show both methods worked
        for (i = 0; i < 50; i++)
        {
            randomNum = rdm.Next(100);
            data.Add(randomNum);
            dta50[i] = randomNum;
        }
        dataB = CountingSort(data);
        PrintArray("Merge Sort:", dataB);
        MergeSort(dta50);
        Console.WriteLine();
        Console.WriteLine("\nCounting Sort:");
        Console.WriteLine();
        for (int x = 0; x < 50; x++)
            Console.Write(dta50[x] + " ");

        Console.WriteLine();
        Console.WriteLine("\nCounting Sort\tMerge Sort");
        for (int n = 1; n < 20; n++) // run 20 times
        {
            data.Clear();
            for (i = 0; i < size; i++)
            {
                randomNum = rdm.Next(size);
                data.Add(randomNum);
                dta[i] = randomNum;
            }
            // Counting Sorting

            startTime = DateTime.Now;
            CountingSort(data);
            endTime = DateTime.Now;
            TimeSpan howlong = endTime.Subtract(startTime);
            Console.Write("  {0}ms", howlong.Milliseconds);

            // Merge Sorting
            startTime = DateTime.Now;
            MergeSort(dta);
            endTime = DateTime.Now;
            TimeSpan howlong1 = endTime.Subtract(startTime);
            Console.WriteLine("\t\t{0}ms", howlong1.Milliseconds);
        }
        Console.ReadLine();
    }
   public static void MergeSort(int[] input, int left, int right)
    {
   if (left < right)
   {
    int middle = (left + right) / 2;

    MergeSort(input, left, middle);
    MergeSort(input, middle + 1, right);

    //Merge
    int[] leftArray = new int[middle - left + 1];
    int[] rightArray = new int[right - middle];

    Array.Copy(input, left, leftArray, 0, middle - left + 1);
    Array.Copy(input, middle + 1, rightArray, 0, right - middle);

    int i = 0;
    int j = 0;
    for (int k = left; k < right + 1; k++)
    {
        if (i == leftArray.Length)
        {
            input[k] = rightArray[j];
            j++;
        }
        else if (j == rightArray.Length)
        {
            input[k] = leftArray[i];
            i++;
        }
        else if (leftArray[i] <= rightArray[j])
        {
            input[k] = leftArray[i];
            i++;
        }
        else
        {
            input[k] = rightArray[j];
            j++;
        }
    }
}
     }
     private static int[] CountingSort(int[] arr, int min, int max)
   {
       int[] count = new int[max - min + 1];
       int z = 0;

       for (int i = 0; i < count.Length; i++) { count[i] = 0; }
       for (int i = 0; i < arr.Length; i++) { count[arr[i] - min]++; }

       for (int i = min; i <= max; i++)
       {
           while (count[i - min]-- > 0)
           {
               arr[z] = i;
               z++;
           }
       }
       return arr;
   }
    static void PrintArray(string title, ArrayList dt)
    {
        int cc = 0;
        Console.WriteLine("\n" + title + "\n");
        foreach (int item in dt)
        {
            if (cc < 10)
                Console.Write("{0,4}", item);
            else
            { Console.WriteLine(); cc = 0; }

        }
    }
}
}

1 个答案:

答案 0 :(得分:1)

看看你的功能:

public static void MergeSort(int[] input, int left, int right)
private static int[] CountingSort(int[] arr, int min, int max)

当你调用它们时,它们都期望三个值。看看你如何调用它们:

MergeSort(dta50);
CountingSort(data);
MergeSort(dta);

您提供的是一个值,而不是三个。

在其他地方,您以不同方式调用它们:

MergeSort(input, left, middle);
MergeSort(input, middle + 1, right);

在这些情况下,您提供三个值。

您需要为函数提供所需的值。否则代码无法知道该怎么做。