随笔-15  评论-10  文章-1  trackbacks-0
  上个Post以数组最右边的那个元素作为支点,这里将
重写partition函数,以数组中间位置作为支点。
实现如下,

int partition(int array[], int left, int right)
{
        /*以中间元素作为支点*/
        int l=left, r=right, pivot=(left+right)/2;

        while (l < r) {
                if (array[l] < array[pivot]) {
                        l++;
                        continue;
                }
                if (array[r] > array[pivot]) {
                        r--;
                        continue;
                }

                SWAP(array+l, array+r);

                /*更新pivot位置*/
                if (pivot==l) pivot=r;
                else if(pivot==r) pivot=l;

                l++; r--;
        }

        /*注意:此时l==r*/
        if (l < pivot) { /*支点在右边*/
                if (array[l] < array[pivot]) l++;
        }
        else if (l > pivot) { /*支点在左边*/
                if (array[l] > array[pivot]) l--;
        }
        SWAP(array+l, array+right);

        /*返回新的支点位置*/
        return l;
}

下一个Post将考虑给出qsort的非递归实现 。。。
posted on 2006-09-12 20:50 hzb 阅读(201) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理