在本次採訪的問題絆倒了。 給定一個大小爲n的數組,其中前n/2是排序的,後半部分是 。將整個陣列排序。 現在我能想到的地方有點像插入排序,將有空間複雜度爲O(1),但時間複雜度將超過O(n)。 O(n)到位解決方案是否可能出現此問題?
8
A
回答
6
有兩個(邏輯)指針 - 讓我們稱它們爲x和y。 x指向前n/2個元素的第一個元素。 y指向第二個n/2元素的第一個元素。如果在y處的元素小於x處的元素(我們稱n(y)和n(x)),則在x處插入n(y),並將y加1 x。否則,將x增加1並再次檢查。一旦y點擊'n',停止y並繼續重複直到x == y。
E.g.
2 4 7 8 1 3 5 6
x y
1 2 4 7 8 3 5 6
x y
1 2 4 7 8 3 5 6
x y
1 2 3 4 7 8 5 6
x y
1 2 3 4 7 8 5 6
x y
1 2 3 4 5 7 8 6
x y
1 2 3 4 5 6 7 8
x y
1 2 3 4 5 6 7 8
(x,y)
3
通常爲了排序兩個已排序的列表,您可以使用合併排序;最簡單的方法是將某個半數組複製到某處。這不是就地,但工作。
交換元件不工作的,因爲它不保證該陣列的第一半的最大值小於在右半最小值:
{ 3 4 4 1 2 4 }
交換I = 0,J = 3
{ 1 4 4 3 2 4 }
交換I = 1,J = 5
{ 1 2 4 3 4 4 }
通過在進一步交換的結果修正此O(N^2)氣泡排序。
相關問題
- 1. 如何將有序數據幀拆分爲前半部分和後半部分
- 2. 將NSArray的後半部分與前半部分交錯
- 3. 打印數組上半部分/後半部分的內容
- 4. 遞歸合併排序只返回ArrayList的前半部分
- 5. 排序與插入部分排序的數組排序
- 6. 最壞情況下的數組排序w(n)在前半部分元素小於另一半時起作用?
- 7. Tableview部分排序最後
- 8. 當前半部分爲空時防止if語句的後半部分
- 9. CSS菜單浮動左半部分和右半部分
- 10. 和ISR的下半部分
- 11. TSQL整數小數點後半部分
- 12. R - 排序半數字列
- 13. 排序分組tableview的部分(標題)
- 14. 部分排序其中某些數字已排序的數組
- 15. Java:排序數組(第2部分)
- 16. 部分按降序排序
- 17. 閱讀文件內容的前半部分和回聲,然後是後半部分
- 18. MagicalRecord NSFetchesResultsController部分分組和排序+內部
- 19. 將前半部分的所有偶數移到整數陣列中的後半部分
- 20. 排序和分組
- 21. Mysql得到表的上半部分然後是表格的下半部分
- 22. 複製ArrayList的前半部分
- 23. 部分排序列表Python
- 24. 部分排序使用sortedArrayUsingDescriptors
- 25. 排序UITableView到部分
- 26. NSFetchedResultsController部分本地排序
- 27. 部分訂單排序?
- 28. iPhone,圓形矩形按鈕的上半部分和下半部分?
- 29. 按Log_time排序,但進入組部分?
- 30. 密集排序與分頁和排序
類似於我的想法,但插入就地意味着移動/交換一系列值 - >慢而不是O(n) – knittl
這不取決於正在使用的數據結構嗎?如果這是一個鏈表,插入是O(1)。但是,我注意到問題是針對數組而不是列表。所以,對於一個數組,它不是O(n)。 – sparkymat
OP寫'數組' – knittl