算法复习--快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。--摘自百度百科

算法的原理用文字叙述不是特别容易理解,有一个出名的视频用真人舞蹈演绎了快速排序算法的全过程,通俗易懂。http://v.youku.com/v_show/id_XMzMyODk4NTQ4.html

递归的主题算法很简单:

        /// <summary>
        /// Quick Sort
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        public static void QuickSort<T>(T[] array, int left, int right) where T : IComparable
        {

            if (left < right)
            {

                int middle = GetMiddleForQuickSort<T>(array, left, right);

                QuickSort<T>(array, left, middle - 1);

                QuickSort<T>(array, middle + 1, right);
            }

        }

最关键的是如何实现GetMiddleForQuickSort

        /// <summary>
        /// get the index of the middle value for qucik sort
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        /// <param name="left"></param>
        /// <param name="right"></param>
        /// <returns></returns>
        private static int GetMiddleForQuickSort<T>(T[] array, int left, int right) where T : IComparable
        {
            T key = array[left];
            while (left < right)
            {
                while (left < right && key.CompareTo(array[right]) < 0)
                {
                    right--;
                }
                if (left < right)
                {
                    T temp = array[left];
                    array[left] = array[right];
                    Console.WriteLine("array[{0}]:{1} ---->  arry[{2}]:{3}", left, temp, right, array[right]);
                    left++;
                }

                while (left < right && key.CompareTo(array[left]) > 0)
                {
                    left++;
                }
                if (left < right)
                {
                    T temp = array[right];
                    array[right] = array[left];
                    Console.WriteLine("array[{0}]:{1} ----> arry[{2}]:{3}", right, temp, left, array[left]);
                    right--;
                }
                array[left] = key;
            }
            Console.WriteLine("find the middle value {0} and the index {1}", array[left], left);
            return left;
        }

测试

        static void Main(string[] args)
        {
            int[] array = new int[] { 77, 22, 9, 22, 32, 11 };
            Console.WriteLine("before quick sort");
            foreach (int i in array)
            {
                Console.Write(i + "->");
            }
            Console.WriteLine();
            SortHelper.QuickSort<int>(array, 0, array.Length - 1);

            Console.WriteLine("after quick sort");
            foreach (int i in array)
            {
                Console.Write(i + "->");
            }
            Console.WriteLine();
            Console.ReadKey();
        }

输出:

before quick sort
77->22->9->22->32->11->
array[0]:77 ---->  arry[5]:11
find the middle value 77 and the index 5
array[0]:11 ---->  arry[2]:9
array[2]:9 ----> arry[1]:22
find the middle value 11 and the index 1
array[2]:22 ---->  arry[3]:22
find the middle value 22 and the index 3
after quick sort
9->11->22->22->32->77->



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值