0

現在、多くの列を含む Excel スプレッドシートがあります。

例えば

Id  Name  Address  Class School SchoolAddress

Class School と School Address がグループとして使用される C# スクリプトを使用して、データを複数のシートに分割したいと考えています。SQL に似ていますGROUP BY

私は現在2つforのループを持っています。

(for int i = 1; i <= range.rows.count; i++)
{ 
   (for int a = 1; a <= range.rows.count; a++)

   //stores them in an array list and splits them
   //takes the Class school and school Address column to compare against
}

現在、長すぎる O(n^2) 時間で実行されています。誰もがより速い解決策を持っていますか?

申し訳ありません。私の質問は、実際にはコードの正確な実装ではなく、ロジックの効率に関するものです

4

1 に答える 1

2

あなたのアルゴリズムの名前は BubbleSort で、非常に遅いです。これは、最速のソーター アルゴリズムの 1 つであるクイック ソート アルゴリズムであり、その複雑さは O(n log n) です。配列のソートにはこれのみを使用します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Quicksort
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create an unsorted array of string elements
            string[] unsorted = { "z","e","x","c","m","q","a"};

            // Print the unsorted array
            for (int i = 0; i < unsorted.Length; i++)
            {
                Console.Write(unsorted[i] + " ");
            }

            Console.WriteLine();

            // Sort the array
            Quicksort(unsorted, 0, unsorted.Length - 1);

            // Print the sorted array
            for (int i = 0; i < unsorted.Length; i++)
            {
                Console.Write(unsorted[i] + " ");
            }

            Console.WriteLine();

            Console.ReadLine();
        }

        public static void Quicksort(IComparable[] elements, int left, int right)
        {
            int i = left, j = right;
            IComparable pivot = elements[(left + right) / 2];

            while (i <= j)
            {
                while (elements[i].CompareTo(pivot) < 0)
                {
                    i++;
                }

                while (elements[j].CompareTo(pivot) > 0)
                {
                    j--;
                }

                if (i <= j)
                {
                    // Swap
                    IComparable tmp = elements[i];
                    elements[i] = elements[j];
                    elements[j] = tmp;

                    i++;
                    j--;
                }
            }

            // Recursive calls
            if (left < j)
            {
                Quicksort(elements, left, j);
            }

            if (i < right)
            {
                Quicksort(elements, i, right);
            }
        }

    }
}

QuickSort の詳細については、次のリンクを参照してください: http://en.wikipedia.org/wiki/Quicksort

于 2013-07-10T08:22:42.553 に答える