88 lines
1.5 KiB
C#
88 lines
1.5 KiB
C#
![]() |
using System;
|
|||
|
|
|||
|
namespace CPF.ReoGrid.Data
|
|||
|
{
|
|||
|
public sealed class ArrayHelper
|
|||
|
{
|
|||
|
public static int QuickFind(int start, int end, Func<int, int> compare)
|
|||
|
{
|
|||
|
return ArrayHelper.QuickFind(start + (end - start + 1 >> 1), start, end, compare);
|
|||
|
}
|
|||
|
|
|||
|
public static int QuickFind(int split, int start, int end, Func<int, int> compare)
|
|||
|
{
|
|||
|
bool flag = split == start || split == end;
|
|||
|
int result;
|
|||
|
if (flag)
|
|||
|
{
|
|||
|
result = split;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
int num = compare(split);
|
|||
|
bool flag2 = num == 0;
|
|||
|
if (flag2)
|
|||
|
{
|
|||
|
result = split;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
bool flag3 = num < 0;
|
|||
|
if (flag3)
|
|||
|
{
|
|||
|
int num2 = split - start + 1 >> 1;
|
|||
|
result = ArrayHelper.QuickFind(split - num2, start, split, compare);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
bool flag4 = num > 0;
|
|||
|
if (flag4)
|
|||
|
{
|
|||
|
int num3 = end - split + 1 >> 1;
|
|||
|
result = ArrayHelper.QuickFind(split + num3, split, end, compare);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
result = -1;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
public static void QuickSort(int[] n, int start, int end)
|
|||
|
{
|
|||
|
while (start < end)
|
|||
|
{
|
|||
|
int num = n[(start + end) / 2];
|
|||
|
int i = start;
|
|||
|
int num2 = end;
|
|||
|
while (i >= num2)
|
|||
|
{
|
|||
|
while (n[i] < num)
|
|||
|
{
|
|||
|
i++;
|
|||
|
}
|
|||
|
while (n[num2] > num)
|
|||
|
{
|
|||
|
num2--;
|
|||
|
}
|
|||
|
bool flag = i >= num2;
|
|||
|
if (flag)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
int num3 = n[i];
|
|||
|
n[i] = n[num2];
|
|||
|
n[num2] = num3;
|
|||
|
i++;
|
|||
|
num2--;
|
|||
|
}
|
|||
|
ArrayHelper.QuickSort(n, start, i - 1);
|
|||
|
start = num2 + 1;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|