2017-04-16 189 views
-2

我使這個程序對數字列表進行排序。它應該是選擇排序,但我的老師說它更像泡泡排序,我需要修復它。任何有關我需要更換哪些部件的建議?選擇排序與泡泡排序C++

#include <iostream> 

using namespace std; 

void printArr(const int a[], int s); 
void swapVals(int& v1, int& v2); 
void sortArr(int a[], int s); 

int main() 
{ 
    const int s = 20; 
    int arr[s] = {8, 38, 25, 4, 47, 47, 38, 36, 3, 33, 2, 19, 16, 30, 5, 47, 16, 
        38, 13, 1 
       }; 

    cout << "Unsorted array:\n"; 
    printArr(arr, s); 
    cout << "\n\n"; 

    sortArr(arr, s); 

    cout << "Sorted Array:\n"; 
    printArr(arr, s); 
    cout << "\n"; 

    return 0; 
} 

void sortArr(int a[], int s) 
{ 
    for (int i = 0; i < s-1; i++) 
    { 
     int index = i; 
     for (int j = i + 1; j < s; j++) 
      if (a[j] < a[index]) 
       index = j; 
     swapVals(a[index], a[i]); 
    } 
} 

void swapVals(int& v1, int& v2) 
{ 
    int temp = v1; 
    v1 = v2; 
    v2 = temp; 
} 

void printArr(const int a[], int s) 
{ 
    for (int i=0; i<s; i++) 
    { 
     cout << a[i]; 
     if (i != s-1) 
      cout << " "; 
    } 
} 
+0

在https://en.wikipedia.org/wiki/Selection_sort中的算法代碼示例中,有一個'iMin!= j'(在您的實現中是'index!= i''''')的測試 - 否則它會顯示是相同的。當爲其他人提供代碼以幫助它時,不要包含多餘的未使用的代碼,例如'FindMIn()'。也許你的老師對你的不一致的縮進感到困惑 - 爲你解決了這個問題(並且刪除了findMin() - 它只是一個分心)。 – Clifford

+0

格式化它明確,添加一些意見,以表明你理解它,而不是隻是從網上覆制它,也許增加一個檢查,以避免與自己交換價值,並重新提交它 - 這是選擇排序實施,但它可能不明確。我還建議在單個語句代碼塊周圍使用大括號 - 它會更清晰 - 特別是如果您的縮進與您的縮進不一致。 – Clifford

+0

這裏可能會有所幫助[鏈接](http://www.cs.csubs.edu/~msarr/visualizations/ComparisonSort.html) – Tyger

回答

0

我相信這是選擇排序,就像你寫代碼的方式,容易讓人誤解。

要改變哪一部分,我不得不說,它在你的sortArr函數裏面,內部循環,最好在這裏添加註釋「找到從i + 1開始的最小索引」,或者你可以直接調用你已經定義的findMin。從調用例程:主調用sortArr,sortArr只調用swap並且不調用findMin,它看起來非常像一個冒泡排序。

此外,你的findMin不好,它發現最小值,而不是最小值的指數。

+0

我的道歉 - 我在原始問題中刪除了未使用的'findMin()' - 我不知道你會在答案中引用它。無論如何,當調用swapVals()時,「index」是最小值的索引。看起來與維基百科上的示例代碼具有不同的變量名稱,並且不會檢查是否與自身交換值。 – Clifford

+0

正如我所說,我相信這是一種選擇,只是不清楚你的老師,這可能會導致你的問題。這可能不是一個真正的編程問題。 –

+0

請注意,這不是我的問題;它只是我的編輯。這個教訓或許不是爲了讓你的老師難以提交格式不好的評論免費代碼。 – Clifford