당신은 LINQ 기반 종류의 프로그램에서 병목 현상이 있음을 결정하기 위해 코드를 테스트 한 적이 있습니까? LINQ의 정렬은 꽤 빠르다. 예를 들어, 아래 코드는 1,000 ~ 10,000 개의 항목을 포함하는 사전 정렬 시간입니다. 1,000 회 이상의 평균 실행 시간은 3.5 밀리 초입니다.
static void DoIt()
{
int NumberOfTests = 1000;
Random rnd = new Random();
TimeSpan totalTime = TimeSpan.Zero;
for (int i = 0; i < NumberOfTests; ++i)
{
// fill the dictionary
int DictionarySize = rnd.Next(1000, 10000);
var dict = new Dictionary<int, string>();
while (dict.Count < DictionarySize)
{
int key = rnd.Next(1000000, 9999999);
if (!dict.ContainsKey(key))
{
dict.Add(key, "x");
}
}
// Okay, sort
var sw = Stopwatch.StartNew();
var sorted = (from kvp in dict
orderby kvp.Key
select kvp).ToList();
sw.Stop();
totalTime += sw.Elapsed;
Console.WriteLine("{0:N0} items in {1:N6} ms", dict.Count, sw.Elapsed.TotalMilliseconds);
}
Console.WriteLine("Total time = {0:N6} ms", totalTime.TotalMilliseconds);
Console.WriteLine("Average time = {0:N6} ms", totalTime.TotalMilliseconds/NumberOfTests);
보고 된 평균에는 JIT 시간 (루프를 처음 실행하는 데 약 35ms 소요됨)이 포함됩니다.
기수 정렬을 잘 수행하면 정렬 성능이 향상 될 수 있지만 최적화 노력이 다른 곳에서 더 잘 수행 될 것으로 판단됩니다.
발견 한 배열 구현 중 하나를 사용하고 키가있는 배열과 값이있는 배열을 유지합니다. 키 배열을 정렬하도록 구현을 수정하고 수정할 때마다 values 배열을 동일하게 수정합니다. – dtb
네, 이미 비슷한 아이디어가 있었고 두 가지 목록도 있습니다. 그러나 두 목록을 관리하면 빠른 기수 정렬의 이점이 없어집니다. 차이점이 QuickSort에 충분히 크지 않기 때문입니다. – Rene