private void SelectSort()
 {
     for (int i = 0; i < arr.Count; i++)
     {
         int minIndex = i;
         DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[i].index, MainControl.ColorSetting["normal"], MainControl.ColorSetting["successed"], false, true));
         for (int j = i + 1; j < arr.Count; j++)
         {
             DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[j].index, MainControl.ColorSetting["normal"], MainControl.ColorSetting["selected"], true, true));
             if (arr[j].num < arr[minIndex].num)
             {
                 DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[j].index, MainControl.ColorSetting["normal"], MainControl.ColorSetting["successed"], false, true));
                 DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[minIndex].index, MainControl.ColorSetting["successed"], MainControl.ColorSetting["normal"], false, true));
                 minIndex = j;
             }
         }
         Log T = MyTools.GetQueueTail(DemoQueue); T.hasNext = false; DemoQueue.Enqueue(T);
         DemoQueue.Enqueue(new Movement(activityType.MOVE, arr[minIndex].index, -(minIndex - i), 0, true));
         DemoQueue.Enqueue(new Movement(activityType.MOVE, arr[i].index, minIndex - i, 0, false));
         arr[i].Swap(arr[minIndex]);
     }
 }
Ejemplo n.º 2
0
        private void ShellSort()
        {
            int len = arr.Count;

            for (int div = len / 2; div >= 1; div = div / 2)
            {
                for (int i = 0; i < div; ++i)
                {
                    int j;
                    for (j = i; j < len; j += div)
                    {
                        DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[j].index, MainControl.ColorSetting["normal"], MainControl.ColorSetting["selected"], false, true));
                    }
                    Log T = MyTools.GetQueueTail(DemoQueue); T.hasNext = false; DemoQueue.Enqueue(T);
                    for (j = i + div; j < len; j += div)
                    {
                        int  k;
                        Part temp = new Part(arr[j]);
                        DemoQueue.Enqueue(new Movement(activityType.MOVE, arr[j].index, 0, 2, false));
                        for (k = j - div; k >= 0 && temp.num < arr[k].num; k -= div)
                        {
                            DemoQueue.Enqueue(new Movement(activityType.MOVE, temp.index, -div, 0, true));
                            DemoQueue.Enqueue(new Movement(activityType.MOVE, arr[k].index, div, 0, false));
                            arr[k + div].Assign(arr[k]);
                        }
                        DemoQueue.Enqueue(new Movement(activityType.MOVE, temp.index, 0, -2, false));
                        arr[k + div].Assign(temp);
                    }
                    for (j = i; j < len; j += div)
                    {
                        DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[j].index, MainControl.ColorSetting["selected"], MainControl.ColorSetting["normal"], false, true));
                    }
                    T = MyTools.GetQueueTail(DemoQueue); T.hasNext = false; DemoQueue.Enqueue(T);
                }
            }
        }
        private void QuickSort(int left, int right)
        {
            if (left == right)
            {
                DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[left].index, MainControl.ColorSetting["normal"]
                                                , MainControl.ColorSetting["successed"], false, false));
                return;
            }
            if (left <= right)
            {
                int temp = UnityEngine.Random.Range(left, right + 1);
                DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[temp].index, MainControl.ColorSetting["normal"], MainControl.ColorSetting["successed"], false, false));
                if (temp != left)
                {
                    DemoQueue.Enqueue(new Movement(activityType.MOVE, arr[temp].index, -(temp - left), 0, true));
                    DemoQueue.Enqueue(new Movement(activityType.MOVE, arr[left].index, temp - left, 0, false));
                    arr[temp].Swap(arr[left]);
                }

                int x = arr[left].num;
                int i = left, j = right;
                while (i < j)
                {
                    while (i < j && arr[j].num >= x)
                    {
                        DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[j].index, MainControl.ColorSetting["normal"], MainControl.ColorSetting["selected"], true, true));
                        j--;
                    }

                    if (i < j)
                    {
                        DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[j].index, MainControl.ColorSetting["normal"], MainControl.ColorSetting["signed"], false, false));
                    }

                    while (i < j && arr[i].num <= x)
                    {
                        DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[i].index, i == left ? MainControl.ColorSetting["successed"] : MainControl.ColorSetting["normal"], MainControl.ColorSetting["selected"], true, true));
                        i++;
                    }

                    bool flag = true;
                    if (i < j)
                    {
                        flag = false;
                        DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[i].index, MainControl.ColorSetting["normal"], MainControl.ColorSetting["signed"], false, false));
                    }

                    if (flag)
                    {
                        Log T = MyTools.GetQueueTail(DemoQueue); T.hasNext = false; DemoQueue.Enqueue(T);
                    }

                    if (i < j)
                    {
                        DemoQueue.Enqueue(new Movement(activityType.MOVE, arr[i].index, j - i, 0, true));
                        DemoQueue.Enqueue(new Movement(activityType.MOVE, arr[j].index, -(j - i), 0, true));
                        DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[i].index, MainControl.ColorSetting["signed"], MainControl.ColorSetting["normal"], false, true));
                        DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[j].index, MainControl.ColorSetting["signed"], MainControl.ColorSetting["normal"], false, false));
                        arr[i].Swap(arr[j]);
                    }
                }
                if (i != left)
                {
                    DemoQueue.Enqueue(new Movement(activityType.MOVE, arr[i].index, -(i - left), 0, true));
                    DemoQueue.Enqueue(new Movement(activityType.MOVE, arr[left].index, i - left, 0, true));
                    DemoQueue.Enqueue(new TurnColor(activityType.TURNCOLOR, arr[i].index, MainControl.ColorSetting["signed"], MainControl.ColorSetting["normal"], false, false));
                    arr[left].Swap(arr[i]);
                }
                QuickSort(left, i - 1);
                QuickSort(i + 1, right);
            }
        }