算法: 排序: 快速排序

 

1. Algrithom

 ◾Given an array of values, pick a value as a pivot value

 ◾Check each value against the pivot value and

   - bring each value higher than the pivot value to the right of the pivot value: GreaterList

   - bring each value lower than or equal to the pivot to the left of the pivot value: LessList

 ◾ Recursively call the algorithm for the array left and the array right of the pivot (which is now in the right spot).

 ◾ Combine LessList + pivot + GreaterList.

 

2. Implement

  public static void TestSimpleQuickSort()

        {

            List<int> intArray = TestData.GetListFromString();

            List<int> result = new List<int>();

            TimeWatcher.StartWatchFunc(SimpleQuickSort, intArray, out result);

            //TimeWatcher.StartWatchDelegate(SimpleQuickSort, intArray, out result);

        }

        

        public static List<int> SimpleQuickSort(List<int> a)

        {

            Random r = new Random();

            List<int> less = new List<int>();

            List<int> greater = new List<int>();

            if (a.Count <= 1)

                return a;

            //int pos = r.Next(a.Count);

            int pos = a.Count/2;



            int pivot = a[pos];

            a.RemoveAt(pos);

            foreach (int x in a)

            {

                if (x <= pivot)

                {

                    less.Add(x);

                }

                else

                {

                    greater.Add(x);

                }

            }

            return Concat(SimpleQuickSort(less), pivot, SimpleQuickSort(greater));

        }



        private static List<int> Concat(List<int> less, int pivot, List<int> greater)

        {

            List<int> sorted = new List<int>(less);

            sorted.Add(pivot);

            foreach (int i in greater)

            {

                sorted.Add(i);

            }



            return sorted;

        }



       
View Code

 

using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Linq;

using System.Text;

using System.Threading.Tasks;



namespace Test.CA.Algorithm.Sorting

{

    public class TimeWatcher

    {

        public delegate List<int> TestDelegate(List<int> array);



        public static void StartWatchAction( Action<List<int>> func, List<int> array)

        {

            Stopwatch watch = new Stopwatch();

            watch.Start();



            func(array);



            watch.Stop();



            Console.WriteLine(watch.Elapsed);

        }



        public static void StartWatchDelegate(TestDelegate func, List<int> array, out List<int> result)

        {

            Stopwatch watch = new Stopwatch();

            watch.Start();



            result = func(array);



            watch.Stop();



            Console.WriteLine(watch.Elapsed);

        }



        public static void StartWatchFunc(Func<List<int>, List<int>> func, List<int> array, out List<int> result)

        {

            Stopwatch watch = new Stopwatch();

            watch.Start();



            result = func(array);



            watch.Stop();

            

            Console.WriteLine(watch.Elapsed);

        }

    }

}
View Code

 

你可能感兴趣的:(快速排序)