Quicksort使用单循环

时间:2013-11-16 09:23:50

标签: c algorithm sorting quicksort

下面的快速排序代码给出的结果不正确。有人能说出什么问题吗?

#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;
}

编辑:只花了几分钟做了一些基本的缩进,而不是要求作者去做。我本可以输入正确的变量名称,但因为答案感觉很好。

2 个答案:

答案 0 :(得分:2)

埋藏在你可能喜欢的那种可怕的代码格式中是这样的:

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);
}

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

答案 1 :(得分:1)

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

在聚会功能中交换[商店]和[q]:

T = A [存储];一个[商店] = A [Q];一个[Q] =α[存储]; -----&GT;这是错误的。

a [q] = t应该是最后一个陈述。

现在它运作正常。无论如何,感谢您的超快反应。