static void Main(string[] args)
        {
            //Rotate Matrix;

            //int[,] matrix = new int[4,4] { { 1, 2,3,4}, { 5,6,7,8 },{ 9,10,11,12},{ 13,14,15,16} };

            //matrix=RotateMatrix(matrix);

            //for (int i = 0; i < matrix.GetLength(0); i++)
            //{
            //    for (int j = 0; j < matrix.GetLength(1); j++) {
            //        Console.Write(matrix[i,j].ToString()+"\t");
            //    }
            //    Console.WriteLine();
            //}

            //Sort Colors

            //char[] colors = new char[] { 'R','G','R','G','R','G'};
            //colors = SortColors(colors);

            //foreach (char ch in colors) {
            //    Console.WriteLine(ch.ToString());
            //}

            int[]             arr    = new int[] { 7, 10, 4, 3, 20, 15 };
            QuickSelectResult result = new QuickSelectResult();

            result.stop = false;

            Console.WriteLine(QuickSelect(arr, 0, arr.Length - 1, 2, result).number.ToString());

            Console.Read();
        }
        public static QuickSelectResult QuickSelect(int[] arr, int left, int right, int k, QuickSelectResult result)
        {
            if (left <= right)
            {
                int pi = Partition(arr, left, right);

                if (pi + 1 == k)
                {
                    result.stop   = true;
                    result.number = arr[pi];
                }

                if (!result.stop)
                {
                    result = QuickSelect(arr, left, pi - 1, k, result);
                }
                if (!result.stop)
                {
                    result = QuickSelect(arr, pi + 1, right, k, result);
                }

                return(result);
            }
            return(result);
        }