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]); } }
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); } }