2015-08-09 149 views
1

上進行互換數他們給了我一個數組,我問找出使用冒泡排序通過冒泡排序定數組

要排序的數組現在我們知道需要互換的數量這一點,我們可以通過n(n-1)/2找到的比較,但我需要的是我的第一直覺是使用冒泡排序的actual swaps

的數量和每個交換(),我遞增交換變量。但時間複雜度是一個非常緩慢的過程,我希望你的幫助找到解決我的困境的優化方法

PS:我還需要比較它是以升序還是降序排序更快。 ...排序兩倍時間。

編輯:

很抱歉,如果我wan't不夠清楚。我想找到不使用Bubble Sort的交換。

+3

去與你的第一直覺。有一個額外的恆定時間操作(增加一個計數),不會改變整個排序方法的漸近運行時間...爲什麼這將是一個'緩慢的過程'? – dingalapadum

+1

「_但這是一個非常緩慢的過程_」錯誤。在這種情況下增加一個操作對時間複雜性沒有影響。此外,它是泡沫排序。如果時間複雜性是一個問題,你永遠不要使用冒泡排序。 – csmckelvey

+0

對不起,我不想使用Bubble Sort。我想知道是否有任何算法可以在不使用Bubble Sort的情況下找到交換 –

回答

2

方面施加swap()a[i]到和a[i+1]作爲氣泡向上的a[i]。 現在,詢問將要發生多少交換與詢問將發生多少次冒泡操作相同。那麼,我們有多少人呢?

每個a[i]都會爲每個位置起泡j > i,其中a[j]<a[i]。換句話說,a[i]將會爲每個位置向右鼓起來,其中該位置的元素值本身小於a[i]。滿足這種條件的一對元素是a[]inversion

因此重新表達您的問題,我們可以問:a[]中的反轉總數是多少? (又名什麼是a[]反轉多少?)

這是一個衆所周知的問題,除了在Ø上運行一些明顯的方法(N^2)典型的辦法處理這一問題是調整歸併排序位在爲了找到這個號碼。並且,由於合併排序在O(n * log(n))中運行,因此您可以使用相同的運行時間查找a[]的反轉編號。

既然你知道你可以調整合並排序,那麼我建議你自己試試看如何準確完成它。

提示:您必須回答的主要問題是:在兩個數組的合併步驟中定位單個元素時,我修復了多少個反轉?然後簡單地將所有這些加起來。

如果您仍然一番考慮後卡住了,你可以看看這裏一些完全成熟的解決方案: