| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 902 人关注过本帖
标题:有人知道怎么证明这个快排算法的正确性吗?
只看楼主 加入收藏
trycsky
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2009-12-18
结帖率:0
收藏
已结贴  问题点数:20 回复次数:1 
有人知道怎么证明这个快排算法的正确性吗?
C++代码:

void QuickSort(int a[], int left, int right)
{
    if (left<right)
    {
        int pivotpos = Partition(a, left, right);
        QuickSort(a, left, pivotpos-1);
        QuickSort(a, pivotpos+1 ,right);
    }
}

int Partition(int a[], int low, int high)
{
    int pivot = median3(a, low ,high);
    int i = low;
    int j = high-1;
    int temp;
    while (1)
    {
        while (i<j && a[i]<pivot)
        {
            ++i;
        }
        while (i<j && a[j]>pivot)
        {
            --j;
        }
        if (i<j)
        {
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
            ++i;
            --j;
        }
        else
            break;
    }
    if (a[i]>pivot)
    {
        a[high] = a[i];
        a[i] = pivot;
    }
    return i;
}

//取最左、最右和中间三个值作比较,使最左边存三者中最小,中间处存三者中最大
//并返回最右值作为基准值
int median3(int a[], int left, int right)
{
    int k = left;
    int mid = (left+right)/2;
    int temp;
    if (a[mid]<a[k])
    {
        k = mid;
    }
    if (a[right]<a[k])
    {
        k = right;
    }
    if (k!=left)
    {
        temp = a[k];
        a[k] = a[left];
        a[left] =temp;
    }
    if (a[right]>a[mid])
    {
        temp = a[right];
        a[right] = a[mid];
        a[mid] = temp;
    }
    return a[right];
}


不理解的地方就是Partition函数while(1)循环跳出后的那个if语句,它只做大于判断,那其它情况呢?
搜索更多相关主题的帖子: 正确性 算法 
2009-12-18 09:21
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:20 
    这个快排跟平时用的快排的思想是一样的吧,只是基准的选取不同,大家都知道快排的稳定性很差,一般Partition都取该区的第一个值作为基准进行划分,这种划分,数列有序会造成快速排序时间复杂度的增加,而这个快排是在当前区间里,将该区间首、尾和中间位置上的关键字比较,取三者之中值所对应的记录作为基准,在划分开始前将该基准记录和该区伺的第1个记录进行交换,这样取基准有了一定的随机性,每次取的肯定不是区域里的最大或最小值,稳定性提高。。
   除了基准选择上有点不同外,其它的好像没什么不同了,但因为基准的位置不同,普通的是放在第一个,这种是放在最后一个,Partition的代码有会有所不同。。
    if (a[i]>pivot)
    {
        a[high] = a[i];
        a[i] = pivot;
    }
这个句子,其实把if去掉是一样的, 直接 a[high] = a[i];a[i] = pivot;只是它考虑的周密了点。。
2009-12-19 14:09
快速回复:有人知道怎么证明这个快排算法的正确性吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016968 second(s), 9 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved