2011-11-18 95 views
1

我已經開始學習C++了。 (我在學校學習應用數學)我必須學習編程。我剛剛在C++中寫了一個最大選擇排序。它應該按降序打印預定義數組的元素,但不起作用。你能告訴我我哪裏錯了嗎?C++ max選擇排序

int* max(int *array) 
{ 
    int *max = array++; 
    while(*array) 
    { 
    if (*max<*array) *max = *array; 
    array++; 
    } 
    return max; 
} 

void change (int *what, int *to) 
{ 
int *temp = what; 
what =to; 
to = temp; 
} 

void sort(int *array) 
{ 
while(*array) change(array,max(array)); 
array++; 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int A[] ={7,5,6,9,2,5,3,1,4,10,6,7,2,8}; 

    sort (A); 
    int i =0; 
    while (A[i]) cout<<A[i++]; 

    getchar(); 
    return 0; 
} 
+3

在所有應有的尊重,這幾乎是C++ ... –

+1

它不工作?崩潰?輸出無效?一些你不明白的錯誤信息? –

+2

@Kerrek:他用cout。 :) –

回答

4

我看到的第一個問題是:while (*array) { ... }不會終止,你想讓它的原因是什麼超出你的數組的最後一個元素是不是一定是0或NULL,或者也可以在中間終止你的數組,如果要排序,其中包括0

相反,你要這樣說的數組:

int A[] = { ... }; 
int element_count = sizeof(a)/sizeof(a[0]); 
for (int i = 0; i < element_count; ++i) { ... } 
+0

+1耐心走過這個。 –

2

你似乎有逆轉指針和值的概念。例如,你的change功能,因爲它是現在,是

void change (int *what, int *to) 
{ 
    int *temp = what; 
    what =to; 
    to = temp; 
} 

當它應該是

void change (int *what, int *to) 
{ 
    int temp = *what; 
    *what = *to; 
    *to = temp; 
} 

這幾乎是完全相反的。

在我看到的max函數中,還有幾處指針錯誤用法,我也可以看到sort函數,這就是我對代碼進行簡短瀏覽後所看到的。你需要回去學習指針,然後再試一次。

2

第二個問題是sort()函數中的array++;不是while循環的一部分。如果這從不退出,我不會感到驚訝。

0

我會嘗試通過使用正確的類型明確地顯示您要做的事情;例如:如果說更多的東西一樣

while (array != NULL) 

甚至

for (int k=0; k<n; k++) 
{ 
    // do something with array[k] 
} 

此外,您change功能似乎應該

while (*array) 
{ 
    ... 
} 

將是一個更容易爲你調試交換指針指向的兩個值,但它不會。

爲了以防萬一它有幫助,我認爲你所做的技術名稱叫做「Selection Sort」。如果你需要詢問其他人的建議,這可能會有所幫助!

祝你好運!

+0

謝謝大家。其實我試圖通過這個學習指針。並把它稱爲最大選擇排序,因爲我一字一句地從匈牙利語翻譯它。 – Kolt

+0

酷!我總是發現最簡單的方法就是學習簡單的方法來做事情(比如使用for循環來完成列表),然後將奇怪的hack-y方式轉換爲我腦海中相應的「簡單」方式。 – user