小小飞鹰

     中国人缺少的是步骤,太急。练太极!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[练手6]快速排序

Posted on 2008-11-25 19:07  小小飞鹰  阅读(188)  评论(0编辑  收藏  举报

目      标      用C#实现快速排序

思      想     此排序为不稳定排序法

                 在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos- 1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字 pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。

实现
       

 public void Sort(int[] intArray)
        {
            int low = 0;
            int high = intArray.Length - 1;
            Sort(intArray, low, high);
        }

        private void Sort(int[] intArray, int low, int high)
        {
            int intPivot;
            if (low < high)
            {
                intPivot = SortOnce(intArray, low, high);
                Sort(intArray, low, intPivot - 1);
                Sort(intArray, intPivot + 1, high);
            }
        }

        private int SortOnce(int[] intArray, int low, int high)
        {
            int intPivot = intArray[low];

            while (low < high)
            {
                while (high > low && intArray[high] >= intPivot)
                {
                    --high;
                }
                //比中心轴记录小的移到左边
                swap(ref intArray, low, high);
                while (high > low && intArray[low] <= intPivot)
                {
                    ++low;
                }
                //比中心轴记录小的移到右边
                swap(ref intArray, low, high);
            }
            intArray[low] = intPivot;

            return low;//返回中心轴记录位置
        }

        private void swap(ref int[] intArray, int low, int high)
        {
            int intTemp = intArray[low];
            intArray[low] = intArray[high];
            intArray[high] = intArray[low];
        }

 

代码下载  快速排序代码