【问题标题】:Quicksort using single loop [closed]使用单循环快速排序[关闭]
【发布时间】:2013-11-16 09:23:49
【问题描述】:

下面的快速排序代码给出了不正确的结果。谁能告诉我出了什么问题?

#include <stdio.h>
#include <stdlib.h>

#define MAX 30

int b[MAX];

void print(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%d\t",a[i]);
    }
    printf("\n");
}

int party(int a[],int p,int q)
{
    int pivot=a[p]; 
    int t=a[p];  

     a[p]=a[q];  
     a[q]=t;

    int i,j,k,store=p;

    for(i=p;i<=q-1;i++)
    {
        if(a[i]<=pivot)
        {
            t = a[i];
            a[i] = a[store];
         a[store] = t;store++;}
    }

   t = a[store];
   a[store] = a[q];
   a[q] = a[store];

   return store;
}

void quicksort(int a[],int p,int q)
{
    if(p>=q)
    {
       return;
    }

    int r=party(a,p,q);

    quicksort(a,p,r-1);
    quicksort(a,r+1,q);
}

int main()
{
    printf("Enter No. oF elements for sorting.\n");
    int i,j,k,n;

    scanf("%d",&n);

    for(i=0;i<n;i++)
    {
        printf("Element %d\t",i+1);   scanf("%d",&b[i]);
    }

    print(b,n);

    quicksort(b,0,n-1);

    print(b,n);
    return 0;
}

编辑:只花了几分钟,做了一些基本的缩进,而不是要求作者这样做。我本可以输入正确的变量名,但自从回答后感觉很好。

【问题讨论】:

  • 尝试问题的缩进和格式。也尝试使用调试器
  • 我建议你调试它,看看会发生什么一步一步。您期望/接收的输出/输入是什么?
  • 请先说出问题所在,然后投反对票。这里的所有问题都不可能质量很好。初学者也用SO。所以如果你能帮忙就太好了。
  • @Rafed Nole,不要介意那些自我专家:D 检查聚会功能是否产生了正确的输出。
  • 我建议您在寻求帮助时选择更好的变量名称并添加 cmets。像`t=a[store];a[store]=a[q];a[q]=a[store];`这样的行需要一些努力,您应该提供注释或将代码放在名为@的函数中例如 987654322@。

标签: c algorithm sorting quicksort


【解决方案1】:

隐藏在您似乎喜欢的可怕代码格式中的是:

t=a[store];a[store]=a[q];a[q]=a[store];

理智的人看起来像这样:

t=a[store];
a[store]=a[q];
a[q]=a[store];

您将 a[q] 设置为与之前相同的值,而不是交换任何内容。它应该是:

t=a[store];
a[store]=a[q];
a[q]=t;

顺便说一句,你不需要低索引和高索引,你只需要一个基数组地址和这个算法的长度(当然还有一点指针数学):

static void swap_int(int *a, int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

void quicksort(int a[], int len)
{
    int i=0, pvt=0;

    if (len <=1)
        return;

    for (;i<len;++i)
    {
        if (a[i] < a[len-1])
            swap_int(a+i,a+pvt++);
    }
    swap_int(a+pvt,a+len-1);
    quicksort(a, pvt++);
    quicksort(a+pvt, len-pvt);
}

你去吧,它甚至内置了分区。枢轴应该是随机选择的,但那是另一天,我想。

【讨论】:

  • 是的,这是一个错误,但与理智无关。对初学者保持冷静。非常感谢。
  • @RafedNole 不用担心。只用一个长度参数试试。你会惊讶于它是多么容易组合在一起。
  • 请您详细说明一下。一个长度参数,即每次将子数组/初始索引的长度传递给派对函数?或快速排序函数?
  • @RafedNole 已发布。看看吧。
  • @RafedNole 现在很多元素都位于枢轴槽的另一侧。请记住,当您将快速排序的子序列发送到递归时,您不包括枢轴槽。它是已知处于正确位置的元素。之前的语句发送a[0]...a[pvt-1] 递增pvt 以跳过下一行的枢轴槽。值得进行一个带有小(10 个左右)乱序序列的调试会话,看看它是如何工作的。相信我。
【解决方案2】:

这是一个非常愚蠢的错误。

在派对函数中交换 a[store] 和 a[q] :

t=a[商店]; a[商店]=a[q]; a[q]=a[商店]; -----> 这是错误的。

a[q]= t 应该是最后一个语句。

现在它工作正常。无论如何,感谢您的超级快速响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多