快速排序法

  快速排序法是一种常用的排序方法,有关快速排序的介绍请看博客  快速排序。

  有关快速排序法,还有几点可以优化的。

    第一:在找基准数据时,从索引firstIndex中间位置mIndex和最后的位置lastIndex中找出最合适的。那么什么样的位置最合适呢?比如数组int[] {4,5,6,1,2},在第一次快速排序时如果只是简单的取4,6,2进行排序,那么6就被作为基准数据,显然数组中的数据就会进行多次的Swap交换。如果把4,6,2的位置进行调整是否会更合适呢?答案是肯定的,调整之后的数组为{2,5,4,1,6}。把4作为基准数据更加合适。恰好SwapIfGreaterWithItems方法就是交换数组元素的。

    第二:计算中间索引值。计算中间索引,一般会用数组的长度/2,在此使用数组长度向右移动一位,简单快捷。

  通过以上两个优化,快速排序就更合理了。

  代码如下:

 private static void QuickSort(int left, int right)
        {
            do
            {
                int low = left;
                int hi = right;
                int median = GetMedian(low, hi);
                try
                {
                    SwapIfGreaterWithItems(low, median);
                    SwapIfGreaterWithItems(low, hi);
                    SwapIfGreaterWithItems(median, hi);
                }
                catch (Exception exception2)
                {
                    throw new Exception(exception2.Message);
                }
                object y = items[median];
                do
                {
                    while (comparer.Compare(items[low], y) < 0)
                    {
                        low++;
                    }
                    while (comparer.Compare(y, items[hi]) < 0)
                    {
                        hi--;
                    }
                    if (low > hi)
                    {
                        break;
                    }
                    if (low < hi)
                    {
                        object obj3 = items[low];
                        items[low] = items[hi];
                        items[hi] = obj3;
                    }
                    low++;
                    hi--;
                } while (low <= hi);
                if ((hi - left) <= (right - low))
                {
                    if (left < hi)
                    {
                        QuickSort(left, hi);
                    }
                    left = low;
                }
                else
                {
                    if (low < right)
                    {
                        QuickSort(low, right);
                    }
                    right = hi;
                }
            } while (left < right);
        }

 

  取两个数中间值(在此是取索引)函数代码:

 private static int GetMedian(int low, int hi)
        {
            return (low + ((hi - low) >> 1));
        }

 

  两个数据元素交换方法代码:

 private static void SwapIfGreaterWithItems(int a, int b)
        {
            if ((a != b) && (comparer.Compare(items[a], items[b]) > 0))
            {
                object obj2 = items[a];
                items[a] = items[b];
                items[b] = obj2;
            }
        }

 

 

 

 

 

 

 

 

  

 

posted @ 2015-05-08 16:01  荣码一生  阅读(246)  评论(0编辑  收藏  举报