Exemple #1
0
        //Bad Idea!!! Starts SOOOO MANY TASKS
        public static void TaskQuickSort(long[] elements, List <Task> listOfTasks)
        {
            // Start Parrent task

            listOfTasks.Add(Task.Factory.StartNew((argsToFunction) =>
            {
                ObectToPass argsPassed = (ObectToPass)argsToFunction;
                TaskQuickSortFunc(argsPassed.Array, argsPassed.Left, argsPassed.Right, listOfTasks);
            }, new ObectToPass(elements, 0, elements.Length - 1)));
        }
Exemple #2
0
        // 2 Many tasks!!
        public static void TaskQuickSortFunc(long[] elements, long left, long right, List <Task> listOfTasks)
        {
            long i = left, j = right;
            var  pivot = elements[(left + right) / 2];

            while (i <= j)
            {
                while (elements[i].CompareTo(pivot) < 0)
                {
                    i++;
                }
                while (elements[j].CompareTo(pivot) > 0)
                {
                    j--;
                }

                if (i <= j)
                {
                    // Swap
                    var tmp = elements[i];
                    elements[i] = elements[j];
                    elements[j] = tmp;

                    i++;
                    j--;
                }
            }

            // Recursive calls
            if (left < j)
            {
                listOfTasks.Add(Task.Factory.StartNew((args) =>
                {
                    ObectToPass argsPassed = (ObectToPass)args;
                    TaskQuickSortFunc(argsPassed.Array, argsPassed.Left, argsPassed.Right, listOfTasks);
                }, new ObectToPass(elements, left, j)));
            }



            if (i < right)
            {
                listOfTasks.Add(Task.Factory.StartNew((args) =>
                {
                    ObectToPass argsPassed = (ObectToPass)args;
                    TaskQuickSortFunc(argsPassed.Array, argsPassed.Left, argsPassed.Right, listOfTasks);
                }, new ObectToPass(elements, i, right)));
            }
        }
Exemple #3
0
        public static void QuickSortTaskParralel(long[] elements)
        {
            Task t1 = Task.Factory.StartNew((argsToFunction) =>
            {
                ObectToPass argsPassed = (ObectToPass)argsToFunction;
                SerialQuicksort(argsPassed.Array, argsPassed.Left, argsPassed.Right);
            }, new ObectToPass(elements, 0, (elements.Length / 4)));


            Task t2 = Task.Factory.StartNew((argsToFunction) =>
            {
                ObectToPass argsPassed = (ObectToPass)argsToFunction;
                SerialQuicksort(argsPassed.Array, argsPassed.Left, argsPassed.Right);
            }, new ObectToPass(elements, (elements.Length / 4) + 1, ((elements.Length / 4) * 2)));


            Task t3 = Task.Factory.StartNew((argsToFunction) =>
            {
                ObectToPass argsPassed = (ObectToPass)argsToFunction;
                SerialQuicksort(argsPassed.Array, argsPassed.Left, argsPassed.Right);
            }, new ObectToPass(elements, ((elements.Length / 4) * 2) + 1, ((elements.Length / 4) * 3)));


            Task t4 = Task.Factory.StartNew((argsToFunction) =>
            {
                ObectToPass argsPassed = (ObectToPass)argsToFunction;
                SerialQuicksort(argsPassed.Array, argsPassed.Left, argsPassed.Right);
            }, new ObectToPass(elements, ((elements.Length / 4) * 3) + 1, elements.Length - 1));

            Task[] listOfTasks = new Task[] { t1, t2, t3, t4 };


            Task.WaitAll(listOfTasks);


            // Merge needed
        }