• 快速排序法


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

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

        第一:在找基准数据时,从索引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;
                }
            }

      

  • 相关阅读:
    【ACM-ICPC 2018 南京赛区网络预赛 L】Magical Girl Haze
    【Manthan, Codefest 18 (rated, Div. 1 + Div. 2) C】Equalize
    【Manthan, Codefest 18 (rated, Div. 1 + Div. 2) B】Reach Median
    工作总结二
    学习总结
    快速WCF
    EF+linq的增删改查
    JAVASCRIPT闭包以及原型链
    CSS声明各个浏览器私有属性的命名前缀
    mvc的model验证,ajaxhelper,验证机制语法
  • 原文地址:https://www.cnblogs.com/zhangyuanbo12358/p/4487951.html
Copyright © 2020-2023  润新知