2012-10-28 207 views
0

我的Quicksort出现问题。对于某些值,它可以工作,但对于其他值则不适用。例如,当第一个值小于最后一个时,它不起作用。我不知道什么是错的。这是代码:快速排序每次不排序

#include <stdio.h> 
#include <time.h> 

#define lenght_max 1000000 
int x; 
int tablica[lenght_max]; 
int q; 

int Partition(left, right) { 

    int tmp; 
    int i; 
    int j; 

    i = -1; 
    j = 0; 

    x = tablica[right]; 
    i = left - 1; 

    for(j = left; j < right; j++){ 
     if(tablica[j] <= x) { 
     i++; 
     tmp = tablica[i]; 
     tablica[i] = tablica[j]; 
     tablica[j] = tmp; 
     } 
    } 

    return i + 1; 
} 

void Quicksort(left, right) {  
    if(left < right){ 
     q = Partition(left, right); 
     Quicksort(left , q - 1); 
     Quicksort(q + 1, right); 
    } 
} 

int main(void) { 

    int i; 
    int temporary; 
    int left; 
    int right; 

    printf("Witaj uzytkowniku. To jest program preferujacy sortowanie szybkie - quicksort.\n"); 
    printf("Podaj, ile liczb chcialbys posortowac: "); 
    scanf("%i", &temporary); 

    printf("Podaj liczby do sortowania: \n"); 

    for(i = 0; i < temporary; i++) 
    scanf("%d", &tablica[i]); 

    left = 0; 
    right = temporary - 1; 
    x = temporary/2; 

    Quicksort(left, right); 

    printf("\nPROCES:\n"); 

    for(i = 0; i < temporary; i++) 
    printf("%d\n", tablica[i]); 

    return 0; 
} 
+0

您的'分区()'方法是可疑的。您将主轴设置为'r + 1'元素(记住数组从0开始),并且从'p'迭代到'r' *独占*。这通常表示一个错误,但不熟悉的变量名称(为什么不使用英语?这几乎是惯例......)使其很难遵循。 – amit

+0

所以r是最后一个元素,p是表 – henio180

+0

中的第一个元素好吧,我看到你现在在那里做了什么,从第二次看起来似乎很好。尽管如此,更好地将变量名称翻译为英语 - 每个人都可以更轻松地遵循,并且您可能会得到更好的答案。 – amit

回答

1

如果我没有忽视这个问题,在我看来,你忘了比在Partition末枢轴的第一要素研磨器交换枢纽。此修复程序应尽可能简单,并补充说:

tmp   = tablica[i+1]; 
    tablica[i+1] = tablica[right]; 
    tablica[right] = tmp; 

return i + 1;语句之前内部Partition

+0

所以我如何解决它? – henio180

+0

它的工作;)谢谢;) – henio180

+0

@ henio180我看到你从来没有接受任何问题的答案。假设这不是故意的,请阅读faq的以下[部分](http://stackoverflow.com/faq#howtoask),最后解释如何处理有用的答案。那么我建议你回去接受你以前的问题中最有用的答案。 – Massimiliano