2016-06-08 52 views
1

所以我期待做你的基本選擇排序。我從書中逐字複製(稍後將列出一個例外)。這是代碼。有花哨瓦特/選擇排序,現在它不會排序

void SelectionSort::sort(int arr[], int size) 
{ 
    int isEqual; 
    int startScan, minIndex, minValue; 

    for (startScan = 0; startScan < (size - 1); startScan++) 
    { 
     minIndex = startScan; 
     minValue = arr[startScan]; 

     for (int index = startScan + 1; index < size; index++) 
     {  
      isEqual = counters(arr[index], arr[index + 1]); 

      if (isEqual == 1) 
      { 
       minValue = arr[index]; 
       minIndex = index; 
      } 
     } 
     arr[minIndex] = arr[startScan]; 
     arr[startScan] = minValue; 
    } 
} 

你會發現我有一個分配給一個方法countersint isEqual。我之所以使用這個,是因爲我想保持比較的結果。

代碼爲counters

int AbstractSort::counters(int a, int b) 
{ 
    counter++; 
    if (a < b) 
     return -1; 
    if (a > b) 
     return 1; 
    if (a == b) 
     return 0; 
} 

基本上,它的作用一樣if (array[index] < minValue)只有這樣我可以跟蹤我的比較。

我在我的QuickSort類中使用這種方法,它對數據進行排序並計數比較沒有問題。但我的SelectionSort不會對數據進行排序!

SelectionSort Error!

它看起來像它移動陣列到前面的最後一個數字,然後什麼也不做。然而它似乎做了190次比較,儘管我沒有特別看到它的勞動成果。

我已經用我的橡皮鴨一行一行的討論了這個代碼,但是我們都沒有發現這個錯誤。 我哪裏錯了?

+4

聽起來像調試器的工作。 –

+0

isEqual == 1表示a> b表示arr [index]> arr [index + 1],但在if語句的主體中,您將arr [index]賦值給一個名爲「minValue」的變量。如果它大於arr [index + 1],arr [index]不能是最小值,可以嗎?你的意思是isEqual == - 1? – SCFrench

+1

isEqual == 1和isEqual == -1僅更改數組排序的順序。所以,一個從高到低,另一個從低到高,但不影響我通過排序的能力(據我所知) – Podo

回答

1

如果你想要的東西就像if (array[index] < minValue)那麼你應該通過minValue到你的counters函數。

+0

這不會比較相鄰的數組值嗎?我保留它的方式,以便我可以從右側工作到左側,隨時進行交換,直到所有內容從左到右排序。 – Podo

+0

我想我對C++太過於陌生,無法理解它是如何工作的。我的計數器類從兩個鄰居元素獲取兩個int值。將minValue傳遞給我的計數器函數仍然執行相同的操作嗎?因爲最小值只是它找到的當前最低值。另外,我不是-1。雖然我可以讓你回到0。 – Podo

+0

是的,你可以通過'minValue'。如果你這樣做,它將成爲當前的最低值。 –

2
isEqual = counters(arr[index], arr[index + 1]); 

這行代碼比較後續元素,發現較小。因此,內循環找到最後一個小於前一個項目的項目,並且找不到範圍中的最小值。不是針對以往比較,比較反對最低:

isEqual = counters(arr[index], minValue); 

(作爲一個說明,arr[index + 1]也讀過去的數組的末尾,所以你很幸運它沒有崩潰)

1

您的選擇排序不正確。

首先,「isEqual」是而不是等於。

其次,您應該在數組的(未排序)餘數中找到最小值。相反,你正在比較每一對相鄰。

is_less_if_lt0 = counters(arr[index], minValue); 

更新minValueminIndex需要。

希望這會有所幫助。