c - 使用单循环快速排序

标签 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;
}

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

最佳答案

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

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

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

关于c - 使用单循环快速排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20016808/

相关文章:

c++ - %*.*d 在 printf() 中如何工作?

c - void typedef 在 C 中如何工作

c++ - 耦合比算法

algorithm - 在有向图中找到所有可能路径中的公共(public)路径

algorithm - 对具有 m 个不同值的 n 个元素进行排序的特定算法

c++ - Protocol Buffer : RepeatedField unique elements

algorithm - 翻牌评估器

java - 顺序很少变化的快速排序

arrays - 串联排序两个数组的奇怪案例

c - 如何在 Emu8086 中使用 'gcc' 从 .c 运行转换后的 .asm 代码