既然這是一個面試問題,我會假設你的水果攤是一個數組。將數組分成八個區域,以便每個區域只包含給定類型的果實,使用七個指針,其中一個指向除第一個區域之外的每個區域的起點。使用第八個指針指向未分類區域的開始位置。
初始化指向數組開頭的指針。獲得指針的定義是棘手的,因爲你必須覆蓋沒有給定類型的結果的情況。一個可能的定義是,指針i包含到目前爲止對類型(包括i)進行排序的水果數量,對於i = 1..8。然後在開始時所有的指針被設置爲等於零並且1 1 1 2 2 3 4 4 |對應於p1 = 3 p2 = 5 p3 = 6 p4 = 8 p5 = p6 = p7 = p8 = 8
重複查看未分類區域開始處的第一個果實以查明其類型。如果不應該進入最後區域,則將其與最終區域開始處的元素進行交換,並將指針推進到最終區域的開始位置。如果它不應該進入第二個區域,則將其與第二個最後區域的開始處的元素進行交換,並將指針前進到第二個最後區域的開始處......等等,直到新水果處於其正確位置。現在將指針移至第一個未排序的水果並重復。
這看每個水果一次,我不認爲你可以用更少的調用排序getType()。你不關心掉期的數量,所以我認爲這是最佳的。
我會放入顯示以c1,c2,c1,c3,c2,c1,c4,c4開頭的交換。我不會在cs中寫字,我會使用|劃分左邊的區域,其中所有的東西都是從右邊的區域開始依次類型是未知的
| 1 2 1 3 2 1 4 4
1 | 2 1 3 2 1 4 4
1 2 | 1 3 2 1 4 4
1 1 | 2 3 2 1 4 4
1 1 2 | 3 2 1 4 4
1 1 2 3 | 2 1 4 4
1 1 2 2 | 3 1 4 4
1 1 2 2 3 | 1 4 4
1 1 2 2 1 | 3 4 4
1 1 1 2 2 | 3 4 4
1 1 1 2 2 3 | 4 4
1 1 1 2 2 3 4 | 4
1 1 1 2 2 3 4 4 |
感謝您的回覆。但是,我無法在這裏理解幾件事情。讓我們假設我們有下面的數組{1,2,3,4,5,6,7,8},其中類型類似於{c1,c2,c1,c3,c2,c1,c4,c4}所以,你意思是我需要有7個不同的指針(p1-p7)指向arr [1]到arr [7]。最終的指針p8應該指向哪裏?另外,你可以用下面的例子來解釋一下:「如果它不應該進入最後的區域,將它與最後區域開始處的元素進行交換,並將指針推進到最後區域的開始位置。」 –
我已經通過你的例子,所以你可以看到什麼交換在哪裏。前七個指針向您顯示不同類型的區域之間的邊界在您已經訂購的部分中。第八個指針顯示有序和無序數據之間的邊界在哪裏。指針定義的細節取決於你如何編寫代碼。 – mcdowella
謝謝,這真的很有幫助! –