2015-09-07 38 views
0

目前我被要求設計四種排序算法(插入,殼,選擇和泡沫),我有4個3中的3個完美工作;唯一不能正常工作的是Bubble Sort。現在,我很清楚正常的氣泡排序如何使用temp var來交換兩個索引,但棘手的部分是它需要使用數組index [0]作爲temp而不是普通的temp,用於交換,並將較低的數組變量向下滑動到列表的前面,並在過程結束時將最後一個索引分配給最大值的temp。使用幻燈片而不是交換的氣泡排序

我一直在玩這一段時間,甚至試圖查找引用,但可悲的是我找不到任何東西。我希望別人已經做到了這一點,並可以提供一些有用的提示。這是一種最後的手段,因爲我一直在用筆和紙來修改和運行通行證,試圖發現我的致命錯誤。無論如何,我的代碼如下...

void BubbleSort(int TheArray[], int size) 
{ 
    for (int i = 1; i < size + 1; i++) 
    { 
     TheArray[0] = TheArray[i]; 
     for (int j = i + 1; j < size; j++) 
     { 
      if (TheArray[j] > TheArray[0]) 
       TheArray[0] = TheArray[j]; 
      else 
      { 
       TheArray[j - 1] = TheArray[j]; 
      } 
     } 
     TheArray[size- 1] = TheArray[0]; 
    } 
} 

感謝您的任何反饋;非常感謝。

+4

它可能支付提供你被要求做的確切的措辭,以防你誤解了它。從我在這裏看到的,你做的第一件事就是覆蓋'TheArray [0]'的值,這不是一件好事。 – paddy

+0

您可以使用[XOR-Swap](https://en.wikipedia.org/wiki/XOR_swap_algorithm)。 –

+1

如果說明的目標是向下移動一個子數組(稱爲幻燈片),那麼它不是一個冒泡排序,但是插入排序的變化可以稱爲刪除排序。在子陣列向下移動時,您仍然需要一個臨時變量來保存第一個值,然後將該值放在當前空閒位置。如果TheArray [0]不被視爲數據的一部分,則可以將其用作臨時變量。 – rcgldr

回答

1

如果我沒有理解問題的陳述,我認爲你正在尋找這些方針的東西:

void BubbleSort(int theArray[], int size) 
{ 
    for (int i = 1; i < size + 1; i++) 
    { 
     theArray[0] = theArray[1]; 
     for (int j = 1; j <= size + 1 - i; j++) 
     { 
      if (theArray[j] > theArray[0]) 
      { 
       theArray[j-1] = theArray[0]; 
       theArray[0] = theArray[j]; 
      } 
      else 
      { 
       theArray[j - 1] = theArray[j]; 
      } 
     } 
     theArray[size-i+1] = theArray[0]; 
    } 
} 

這件作品是你的代碼失蹤了,我想,是,一旦你找到了新的最大值,在將新的最大值放入Array [0]存儲位置之前,必須將其放回數組中(比較後請參閱Array [j-1] = theArray [0])。此外,由於最後一個元素將成爲當前最大值,所以內部循環每次都要少運行一次,因此您不想重新訪問這些數組元素。 (參見(INT J = 1;Ĵ< =大小+ 1 - 我; J ++))

爲了完整起見,這裏是我以前(輕度)測試此的主要驅動力:

int main() 
{ 
    int theArray[] = { 0, 5, 7, 3, 2, 8, 4, 6 }; 
    int size = 7; 

    BubbleSort(theArray, size); 
    for (int i = 1; i < size + 1; i++) 
     cout << theArray[i] << endl; 
    return 0; 
}