| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1751 人关注过本帖
标题:快速排序如何修改能显示出趟数和比较次数以及交换次数
只看楼主 加入收藏
暗色夜雨
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2017-5-21
结帖率:0
收藏
已结贴  问题点数:20 回复次数:1 
快速排序如何修改能显示出趟数和比较次数以及交换次数
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
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:20 
你参考这个统计,挺简单的。

程序代码:
#include<stdio.h>

int k, m, n1;  //k排序次数,m比较次数, n1交换次数

int main()
{
    void Qsort(int *s, int left, int right);
    int arr[100];
    int i, n;

    printf("Please inout n number sort!\n");
    scanf("%d", &n);
    for (i = 0; i < n; ++i)
        scanf("%d", &arr[i]);
    Qsort(arr, 0, n - 1);
    for (i = 0; i < n; ++i)
        printf("%d ", arr[i]);
    printf("\n排序次数:%4d\n比较次数:%4d\n交换次数:%4d\n", k, m, n1);
    return 0;
}

void Qsort(int *arr, int left, int right)
{

    int i = left;
    int j = right;
    int temp = arr[i];

    m++;
    if (left >= right)
    {

        return;
    }

    m++;
    while (i < j)
    {
        m++;
        while (i < j && temp <= arr[j])
            j--;

        m++;
        if(i < j)
        {
            arr[i] = arr[j];
            n1++;
        }

        m++;
        while (i < j && temp >= arr[i])
            ++i;

        m++;
        if(i < j)
        {
            arr[j] = arr[i];
            n1++;
        }

    }
    arr[i] = temp;
    k++;
    Qsort(arr, left, i - 1);
    Qsort(arr, i + 1, right);
}
2017-05-21 16:27
快速回复:快速排序如何修改能显示出趟数和比较次数以及交换次数
数据加载中...
 
   



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

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