private static void Heapify(DataArray data)
 {
     for(int i = data._vector.Length / 2 - 1; i >= 0; i--)
     {
         Sink(data._vector, i, data._vector.Length);
         // → invariant: a[1, n] in heap order
     }
 }
        static void Main(string[] args)
        {
            DataArray data = new DataArray("Merge Sort.txt");
            //data.Print();

            MergeSort(data);
            //data.PrintVector();
            data.PrintVectorToFile();

            Console.ReadKey();
        }
        private static void SortDown(DataArray data)
        {
            int[] a = data._vector;
            int n = a.Length;

            for (int i = 0; i < n; i++)
            {
                Swap(a, 0, n - i - 1);
                Sink(a, 0, n - i - 1);
                // → invariant: a[n - i + 1, n] in final position
            }
        }
        static void Main(string[] args)
        {
            DataArray data = new DataArray("Counting Inversions.txt");

            //data.PrintVector();
            //Console.ReadKey();

            long count = InvCount(data._vector);

            Console.WriteLine(count);
            Console.WriteLine("Finish!");
            Console.ReadKey();
        }
        static void Main(string[] args)
        {
            DataArray array = new DataArray("Heap Sort.txt");
            //array.Print();
            //Console.WriteLine();

            HeapSort(array);

            array.PrintVectorToFile();
            //Console.WriteLine();

            Console.WriteLine("Finish!");

            Console.ReadKey();
        }
        static void Main(string[] args)
        {
            DataArray data = new DataArray("3-Way Partition.txt");
            //data.Print();
            //Console.WriteLine();

            //_3WayPartition(data._vector, 0, data._vector.Length - 1);
            _3WayPartition1(data._vector, 0, data._vector.Length - 1);
            data.Print();
            //data.PrintVectorToFile();
            //Console.WriteLine();

            Console.WriteLine("Finish!");
            Console.ReadKey();
        }
        static void Main(string[] args)
        {
            DataArray data = new DataArray("2-Way Partition.txt");
            //data.Print();

            int j = data._vector.Length - 1;

            //while (j != 0)
            {
                j = _2WayPartition(data._vector, 0, j);
            }
            //_2WayPartition1(data._vector);

            //data.PrintVector();
            data.PrintVectorToFile();

            Console.ReadKey();
        }
 private static void MergeSort(DataArray data)
 {
     int[] aux = new int[data._vector.Length];
     Sort(data._vector, aux, 0, data._vector.Length - 1);
 }
 private static void HeapSort(DataArray data)
 {
     Heapify(data);
     SortDown(data);
 }