2012-10-28 244 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