2014-05-17 36 views
-1

我有qsort麻煩,如果有人能幫助我,我會很感激。快速排序處理指針

另外,我還搜查SO很多之前詢問,但沒有成功。

下面是我的程序大致設置:

〜.H〜

class playerClass{ 
    playerClass() { } 
    ... 
    double average; 
}; 

class Stats{ 
    void update(...); 
    ... 
    playerClass *ar[1201]; 
}; 

〜〜的.cpp

void update(...){ 
    playerClass *p = new playerClass(); 
    ... 
    for (int i = 0; i < count; i++){ 
     ... 
     ar[j]->average = (ar[j]->hits)/(ar[j]->atBats); 
     cout << "Average: " << ar[j]->average << endl; 

     /* Prints Averages correctly, but I need everything to be sorted by 
      the Averages, and I am instructed to use qsort */ 

     qsort(*ar, count, sizeof(playerClass*), compare); 
     cout << "Sorted average: " << ar[j]->average << endl; 
    } 
} 

int compare (const void *a, const void *b){ 
    playerClass *x = (playerClass*)a; 
    playerClass *y = (playerClass*)b; 

    /* I believe that I'm not correctly accessing the Averages with 
     the two statements above, I have tried many different variations 
     of them, but I am not actually able to access the averages correct. 
     Can someone please help me, so that way I can get over this obstacle 
     and continue this assignment? */ 

    if (x < y) return -1; 
    if (x > y) return 1; 
    return 0; 
} 
+3

C++有許多很好的[算法在其標準庫(http://en.cppreference.com/w/cpp/algorithm),那些更適合對於C++而言,比像'qsort'這樣的舊C函數更爲重要。我建議你閱讀['std :: sort'](http://en.cppreference.com/w/cpp/algorithm/sort)。 –

+0

還要注意,'ar'是一個指針數組,這意味着'* ar'不會達到你期望的值。我還建議你閱讀['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)。 –

+0

@JoachimPileborg - 同意;但「任務」要求使用'qsort' ... – Floris

回答

2

你想在你的compare功能來取代這兩條線:

playerClass *x = (playerClass*)a; 
playerClass *y = (playerClass*)b; 

double x = ((playerClass*) a)->average; 
double y = ((playerClass*) b)->average; 

,因爲你正在使用xy比較平均,沒有做交換。當你的指針類分配給xy你會比較他們的三分球 - 這是不太可能你想要的順序 - 讓你的一種「在它們被放置在內存中的順序」結束。

更新這裏是一個非常簡單的程序,它創建一個類,該類的元素數組以及指向該元素的指針數組。它使用指針數組調用qsort,並且它演示了原始數組最終排序。

看是否有此一起幫助你...

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

class playerClass { 
    public: 
    double average; 
}; 

// some values for initialization 
double values[] = { 40, 10, 100, 90, 20, 25 }; 

int compare (const void * a, const void * b) 
{ 
    return (((playerClass*)a)->average - ((playerClass*)b)->average); 
} 

int main() 
{ 
    int ii; 
    playerClass b[6]; // create 6 elements of the "class" 
    playerClass *a[6]; // create pointers to the elements 
    for(ii=0; ii<6; ii++) { 
    b[ii].average = values[ii]; // put values in the elements 
    a[ii] = &b[ii]; // make the pointers point to sensible things 
    } 

    qsort (a[0], 6, sizeof(playerClass), compare); // perform qsort 
    // and print results: 
    for (ii=0; ii<6; ii++) 
    printf ("%.0f ",b[ii].average); 
    printf("\n"); 
    return 0; 
} 

此輸出排序的值:

10 20 25 40 90 100 

PS我道歉,如果這看起來像C ......那是,除了class的定義。我可以用struct用這種(無功能)類的,它會工作方式相同。

PPS - 你可以做

qsort(b, 6, sizeof(playerClass), compare); 

,它會工作得同樣好。

我認爲你的問題是,你仍然在嘗試對某個POINTER的大小進行排序,當它應該是整個CLASS對象的大小時。

所以我覺得

qsort(ar, count, sizeof(playerClass), compare); 

是解決這個問題的方法(我只注意到你的編輯之一,你拿出提到playerClass *ar[N];行...)

注意事項
如果編輯問題以包含有關錯誤的建議,則很難跟蹤答案。這是更好地低於添加的更新 - 像

「作爲@JohnDoe指出,我應該用ar代替*ar所以我改變了我的代碼...現在的問題是...對於誰遵循人。一會兒的問題,並盡力幫助你得到一個答案,那就是真的很有幫助。

否則,我們來看看編輯歷史搞清楚正在發生的事情。什麼意義?

+0

嗨弗洛里斯,這對我來說確實有意義,我很感激。我接受了你的建議,但是我的程序seg錯誤了,我通過將* ar的第一個參數從* ar簡化爲ar來固定它。至少,它現在編譯並且與未排序的平均值不同,但它仍然沒有按升序或降序排序。有任何想法嗎? – user3648308

+0

你能夠使用'qsort'嗎?嘗試一個簡單的雙打數組,並確保你可以在像這樣的複雜事情之前讓它工作。我經常發現,小步前進會讓你得到答案。數組 - >數組結構 - >類數組將是我慢慢地讓我的問題變得更難的方式;那麼當它破裂時,我有辦法縮小它的範圍。 – Floris

+0

如果以上內容不夠,如果您會顯示更多代碼 - 例如,如何初始化'ar'中的值以及如何打印出「已排序」值,將會有所幫助。換句話說 - 更完整的程序。很多時候「問題出在你沒有顯示的代碼中」。這是開始聞起來那樣... – Floris

2

除了@Floris之外swer,你應該在循環之外移動qsort。否則,您會多次對陣列進行不必要的排序。

你也必須給ar地址,而不是第一個元素

for (int i = 0; i < count; i++) { 
    ... 
} 

qsort(ar, count, sizeof(ar[0]), compare); 

還要注意,compare必須是無功能或某個類的靜態成員。

更新:

我複製調用qsort,而不注意在sizeof部分。 qsort需要數組元素的大小,這是一個指針playerClass。您可以給第一個元素ar[0]

qsort(ar, count, sizeof(ar[0]), compare); 

或正確的類型playerClass*

qsort(ar, count, sizeof(playerClass*), compare); 

更新:

第三次嘗試,要排序的指針數組。這有兩個含義

  • 正如上面提到你必須給sizeof(playerClass*)的大小參數來快速排序
  • 到比較函數的參數是指向元素,在這種情況下指針的指針來playerClass。這導致下面的比較函數

    int compare(const void *a, const void *b) 
    { 
        playerClass *x = *(playerClass**)a; 
        playerClass *y = *(playerClass**)b; 
    
        if (x->average < y->average) 
         return -1; 
    
        if (x->average > y->average) 
         return 1; 
    
        return 0; 
    } 
    
+0

是的 - 我只專注於「我正在訪問平均錯誤」的問題的一部分,但你對此絕對正確。 – Floris