我正在做一些算法分配,並被問及以下內容:排序O(n)中的元素'r'或'w'的數組,以便'r始終在'w's之前。因此,如果輸入看起來像[w,r,w,r,w,r,w,w],算法運行後,數組看起來像[r,r,r,w,w,w,w,w ]。爭論我的算法是正確的,並在範圍內
從概念上講,這看起來很清楚。我必須使用兩個邊界變量來保存第一個'w'元素的位置,一個用於最後一個'r'元素。
我的代碼如下:
char[] A = new char[] { 'w', 'r', 'w', 'r', 'w', 'r', 'w', 'w' };
int lastRedPosition = A.Length - 1;
int firstWhitePosition = 0;
for (int i = firstWhitePosition ; i < A.Length; i++)
{
// determine the first red from the right e.g. the lastred, ending at the firstwhite position
for (int j = lastRedPosition; j > firstWhitePosition; j--)
{
if (A[j] == 'r')
{
lastRedPosition = j;
break;
}
}
for (int k = firstWhitePosition; k < lastRedPosition; k++)
{
if (A[k] == 'w')
{
firstWhitePosition = k;
break;
}
}
A[firstWhitePosition] = 'r';
A[lastRedPosition] = 'w';
}
現在,我認爲它運行在O(n)的,直觀的,儘管嵌套for循環。這是因爲,總而言之,數組只被遍歷一次。因爲我們正在跟蹤lastRedPosition和firstWhitePosition變量的位置。
但是我發現很難激發這個更正式的,因爲相同的嵌套for循環...有人可以給我一些指向正確的directopm指針?
這看起來像一個糟糕的合併排序。 – Woot4Moo
這看起來很像計數排序。 http://www.geekviewpoint.com/java/sorting/countingsort。由於你只有兩個不同的元素,你的時間複雜度是O(n + 2),它是O(n)。那裏的解釋可能會幫助你形式化你的論點。也可以看看你的教科書中的排序參數,並使用它。如果你的文本中沒有計算排序,請查看bucketsort。 –