快速排序

下面代码包含两种风格不一样的写法:

public class QuickSort

    {

        ///<summary>

        /// 分割函数

        ///</summary>

        ///<param name="list">待排序的数组</param>

        ///<param name="left">数组的左下标</param>

        ///<param name="right"></param>

        ///<returns></returns>

        public static int Division(List<int> list, int left, int right)

        {

            //首先挑选一个基准元素

            int baseNum = list[left];



            while (left < right)

            {

                while (left < right && list[right] >= baseNum)

                {

                    right = right - 1;

                }



                list[left] = list[right];



                while (left < right && list[left] <= baseNum)

                {

                    left = left + 1;

                }



                list[right] = list[left];

            }

            //最后就是把baseNum放到该left的位置

            list[left] = baseNum;



            //最终,我们发现left位置的左侧数值部分比left小,left位置右侧数值比left大

            //至此,我们完成了第一篇排序



            return left;

        }



        public static void QuickSortCore(List<int> list, int left, int right)

        {

            if (left < right)

            {

                int i = Division(list, left, right);

                QuickSortCore(list, left, i - 1);

                QuickSortCore(list, i + 1, right);

            }

        }



        private static int SortUnit(int[] array, int low, int high)

        {

            int key = array[low];

            while (low < high)

            {

                /*从后向前搜索比key小的值*/

                while (array[high] >= key && high > low)

                    --high;

                /*比key小的放左边*/

                array[low] = array[high];

                /*从前向后搜索比key大的值,比key大的放右边*/

                while (array[low] <= key && high > low)

                    ++low;

                /*比key大的放右边*/

                array[high] = array[low];

            }



            /*左边都比key小,右边都比key大。//将key放在游标当前位置。//此时low等于high */

            array[low] = key;

            //foreach (int i in array)

            //{

            //    Console.Write("{0}\t", i);

            //}

            return high;

        }



        public static void Sort(int[] array, int low, int high)

        {

            if (low >= high)

                return;

            /*完成一次单元排序*/

            int index = SortUnit(array, low, high);

            /*对左边单元进行排序*/

            Sort(array, low, index - 1);

            /*对右边单元进行排序*/

            Sort(array, index + 1, high);

        }

    }

快速排序最好的时间复杂度为O(nlogn),最坏的时间复杂度为O(n²),平均复杂度为O(nlogn)。

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