zoukankan      html  css  js  c++  java
  • 快速排序法

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

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

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

      

  • 相关阅读:
    MyBatis collection的两种形式——MyBatis学习笔记之九
    MyBatis 一对一(OneToOne)__SELECT
    Mybatis 一对一(OneToOne)关系映射__INSERT
    mybatis association表关联与rowbounds共同使用时的异常及其解决方案
    Mybatis Laz-Load功能实现代码赏析(原创)
    mybatis sql中的条件语句
    HDFS之四:HDFS原理解析(总体架构,读写操作流程)
    Mybatis多参数查询映射
    mysql索引之六:mysql高效索引之覆盖索引
    MYSQL BENCHMARK()函数
  • 原文地址:https://www.cnblogs.com/zhangyuanbo12358/p/4487951.html
Copyright © 2011-2022 走看看