在本次采访的问题绊倒了。 给定一个大小为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