标题:快速排序如何修改能显示出趟数和比较次数以及交换次数
取消只看楼主
暗色夜雨
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2017-5-21
结帖率:0
已结贴  问题点数:20 回复次数:0 
快速排序如何修改能显示出趟数和比较次数以及交换次数
void quick(table *tab,int left,int right)//left和right为左右边界的下标
{
    int i,j,k,m,a,b;//m为排序趟数,a为排序比较次数,b为排序交换次数
    if(left<right)
    {
        printf("第%d趟排序结果:",m);
        i=left;
        j=right;
        tab->r[0]=tab->r[i];//以最左边第1个元素为标准进行划分,将位置i空出
        while(i!=j)
        {
            while(tab->r[j].key>tab->r[0].key&&i<j)//从右向左找,找到第一个小于标准值的元素位置j
            {
                j--;
            }
            if(i<j)
            {
                k=i;
                tab->r[k].key=tab->r[j].key;//将j置于左端空位置i,i向右移动,j原本位置空出
                i++;
            }
            while(tab->r[i].key<tab->r[0].key&&i<j)//从左向右找,找到第一个大于标准值的元素位置i
            {
                i++;
            }
            if(i<j)
            {
                k=j;
                tab->r[k].key=tab->r[i].key;//将i置于右端空位置j,j向左移动,i原本位置空出
                j--;
            }
        }
        k=i;
        tab->r[k]=tab->r[0];//将标准值放入其最终位置,此时i=j
        for(k=1;k<=tab->length;k++)
            printf("%2d",tab->r[k].key);
            printf("\n");
        quick(tab,left,i-1,);//对标准值左边部分递归调用该函数
        quick(tab,i+1,right);//对标准值右边部分递归调用该函数
    }
    printf("排序比较次数:\n",a);
    printf("排序交换次数:\n",b);
}
int main()
{
    int i;
    table a;//定义一个结构体
    table *p;
    a.length=4;//length不是结构体里的,a.length是结构体里的
    for(i=1;i<=a.length;i++)
    scanf("%2d",&a.r[i].key);
    p=&a;
    printf("***************\n");
    printf("排序结果:");
    for(i=1;i<=a.length;i++)
        printf("%d ",a.r[i].key);
    printf("\n");
   
}
搜索更多相关主题的帖子: 如何 元素 左右 
2017-05-21 13:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-477201-1-1.html




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

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