private int Select(int[] arr, int k, TabControl tabControl) { if (arr.Length <= 10) { return(Find(CopyArray(arr), k)); } int pivotNumber = ChooseWisePivot(CopyArray(arr), tabControl); List <int> copy = arr.ToList(); int pivotIndex = Partition(ref arr, pivotNumber); TabControl t = null; string page = "Partition"; GUI_Manager.AddPage(tabControl, page); t = GUI_Manager.AddPartition(tabControl, page, copy, arr.ToList(), pivotIndex, pivotNumber, k); if (k <= pivotIndex) { int[] a1 = CreateArraySmaller_BiggerThanPivot(CopyArray(arr), pivotNumber, true); if (a1.Length <= 10) { GUI_Manager.AddFinalResult(t ?? tabControl, a1.ToList(), k); } int right = Select(CopyArray(a1), k, t ?? tabControl); return(right); } else { int[] a2 = CreateArraySmaller_BiggerThanPivot(CopyArray(arr), pivotNumber, false); if (a2.Length <= 10) { GUI_Manager.AddFinalResult(t ?? tabControl, a2.ToList(), k - pivotIndex); } int left = Select(CopyArray(a2), k - pivotIndex, t ?? tabControl); return(left); } }
private int ChooseWisePivot(int[] arr, TabControl tabControl) { GUI_Manager.AddArrayPage(tabControl, arr.ToList()); string page = "Split Array"; TabPage p = GUI_Manager.AddPage(tabControl, page); TreeView tv = GUI_Manager.CreateTreeView(p); List <int> b = new List <int>(); int iMax = (int)Math.Ceiling(arr.Length / 5.0); int[] m = new int[iMax]; int index = 0, i = 0; while (i != arr.Length) { b.Add(arr[i++]); if (b.Count == 5) { page = index.ToString(); GUI_Manager.AddList(tv, b, page); b.Sort(); m[index++] = b[2]; b.Clear(); } } if (iMax != index) { page = index.ToString(); GUI_Manager.AddList(tv, b, page); b.Sort(); m[index] = b[(int)Math.Floor(b.Count / 2.0)]; } tv.ExpandAll(); TabControl tControl = null; int half = (int)Math.Ceiling(m.Length / 2.0) - 1; int meridian = -1; if (iMax > 10) { page = "Select Split Array"; GUI_Manager.AddPage(tabControl, page); tControl = GUI_Manager.AddTabControl(tabControl, page); meridian = Select(CopyArray(m), half, tControl); } else { meridian = Select(CopyArray(m), half, tControl); GUI_Manager.AddSummarySplit(tabControl, m.ToList(), meridian); } return(meridian); }