コード例 #1
0
    private IEnumerable <int> RightSort()
    {
        wasSorted = false;
        int offset  = 0;
        int offsetA = 0;

        for (int i = Array.Count - 1 - rightOffsetStart - leftCounter; i > 0 + rightOffsetEnd + rightCounter; i--)
        {
            offsetA++;
            if (Array[i] < Array[i - 1])
            {
                offsetA   = 0;
                wasSorted = true;
                int tmpVal = Array[i];
                Array[i]     = Array[i - 1];
                Array[i - 1] = tmpVal;
                RelocateElements(i - 1, i);
            }
            if (!wasSorted)
            {
                offset++;
            }

            CompareElements(true,
                            ElementColor.Build(i, Color.red),
                            ElementColor.Build(i - 1, Color.red));
            yield return(i);
        }

        rightCounter++;
        rightOffsetStart += offset - 1;
        rightOffsetEnd   += offsetA;
    }
コード例 #2
0
    private IEnumerable <int> LeftSort()
    {
        wasSorted = false;
        int offset  = 0;
        int offsetA = 0;

        for (int i = 0 + rightCounter + leftOffsetStart; i < Array.Count - 1 - leftOffsetEnd - leftCounter; i++)
        {
            offsetA++;
            if (Array[i] > Array[i + 1])
            {
                offsetA   = 0;
                wasSorted = true;
                int tmpVal = Array[i];
                Array[i]     = Array[i + 1];
                Array[i + 1] = tmpVal;
                RelocateElements(i + 1, i);
            }
            if (!wasSorted)
            {
                offset++;
            }

            CompareElements(true,
                            ElementColor.Build(i, Color.red),
                            ElementColor.Build(i + 1, Color.red));
            yield return(i);
        }

        leftCounter++;
        leftOffsetStart += offset - 1;
        leftOffsetEnd   += offsetA;
    }
コード例 #3
0
    public override IEnumerable <int> Sort()
    {
        for (int i = 0; i < Array.Count; i++)
        {
            bool isSorted = true;
            for (int a = 0; a < Array.Count - i - 1; a++)
            {
                if (Array[a] > Array[a + 1])
                {
                    int tmp = Array[a];
                    Array[a]     = Array[a + 1];
                    Array[a + 1] = tmp;
                    RelocateElements(a, a + 1);
                    isSorted = false;
                }
                CompareElements(true,
                                ElementColor.Build(a, Color.red),
                                ElementColor.Build(a + 1, Color.red));
                yield return(i);
            }

            if (isSorted)
            {
                FinishSorting();
                yield break;
            }
        }
        FinishSorting();
    }
コード例 #4
0
    public override IEnumerable <int> Sort()
    {
        for (int i = 1; i < Array.Count; i++)
        {
            if (Array[i] >= Array[i - 1])
            {
                continue;
            }
            CompareElements(true, ElementColor.Build(i, Color.green));
            yield return(i);

            min = 0;
            max = i;

            while (min <= max)
            {
                int key = Array[i];
                int mid = (min + max) / 2;
                CompareElements(true,
                                ElementColor.Build(i, Color.green),
                                ElementColor.Build(mid, Color.red));
                yield return(i);

                if (mid == 0 && key <= Array[mid])
                {
                    ShiftArray(mid, i, Array);
                    break;
                }
                if (key <= Array[mid + 1] && key >= Array[mid])
                {
                    ShiftArray(++mid, i, Array);
                    break;
                }
                else if (key < Array[mid])
                {
                    max = mid - 1;
                }
                else
                {
                    min = mid + 1;
                }
            }
        }

        FinishSorting();
    }
コード例 #5
0
    private IEnumerable <int> SortChunk(int startIndex, int endIndex)
    {
        int median      = GetMedianSimple(startIndex, endIndex);
        int rightOffset = 0;

        for (int i = startIndex; i < endIndex - rightOffset; i++)
        {
            CompareElements(true,
                            ElementColor.Build(endIndex, Color.blue),
                            ElementColor.Build(startIndex, Color.blue),
                            ElementColor.Build(i, Color.green));

            if (Array[i] >= median)
            {
                for (int a = endIndex - rightOffset; a > i; a--)
                {
                    CompareElements(true,
                                    ElementColor.Build(i, Color.green),
                                    ElementColor.Build(a, Color.red),
                                    ElementColor.Build(endIndex, Color.blue),
                                    ElementColor.Build(startIndex, Color.blue));

                    rightOffset++;
                    if (Array[a] < median)
                    {
                        SwapElements(i, a);
                        //yield return a;
                        break;
                    }

                    yield return(a);
                }
            }

            yield return(i);
        }
    }
コード例 #6
0
    public override IEnumerable <int> Sort()
    {
        for (int i = 1; i < Array.Count; i++)
        {
            if (Array[i] >= Array[i - 1])
            {
                continue;
            }
            CompareElements(true,
                            ElementColor.Build(i, Color.green),
                            ElementColor.Build(i - 1, Color.red));
            yield return(i);

            for (int a = i; a > 0; a--)
            {
                int b = a - 1;
                CompareElements(true,
                                ElementColor.Build(i, Color.green),
                                ElementColor.Build(b, Color.red));
                yield return(a);

                if (Array[i] >= Array[b])
                {
                    ShiftArray(b + 1, i, Array);
                    break;
                }
                else if (b == 0)
                {
                    ShiftArray(b, i, Array);
                    break;
                }
            }
        }

        FinishSorting();
    }