python - python中的插入排序,列表末尾有负数
问题描述
我使用排序算法对数字进行排序,例如正数,然后是负数(就地交换,您可以使用变量但不使用任何容器变量。假设我们没有更多的内存空间用于额外的容器)。所以首先排序的正数,然后是排序的负数。
我做到了,但我需要另一个for
循环来对底片进行排序并将它们插入到列表的末尾。
我的问题:有没有办法修改第一个循环以达到相同的结果?(即:仅使用 1 个for
循环)
例如:
x = [9, -3, 2, -7, -4, -1, 5, 4]
输出应该是:
[2, 4, 5, 9, -7, -4, -3, -1]
这是我的解决方案(但我使用了 2 个for
循环,我只想使用 1 个):
def insertion_sort(data):
for i in range(1, len(data)):
e = i
while e > 0 and data[e - 1] > data[e]:
data[e - 1], data[e] = data[e], data[e - 1]
e -= 1
for i in range(1, len(data)):
e = i
while e > 0 and data[e - 1] < 0:
if data[e] < 0:
if data[e - 1] < data[e]:
data[e - 1], data[e] = data[e], data[e - 1]
data[e - 1], data[e] = data[e], data[e - 1]
e -= 1
print(data)
解决方案
当数字开始为正时,您只需要找到枢轴值
def insertion_sort(data):
pivot = -1
for i in range(1, len(data)):
e = i
while e > 0 and data[e - 1] > data[e]:
data[e - 1], data[e] = data[e], data[e - 1]
if data[e] >= 0 and data[e-1] < 0:
pivot = e
e -= 1
data[-pivot:], data[:-pivot] = data[:pivot], data[pivot:]
print(data)
推荐阅读
- reactjs - 使用 axios 将更多数据与 formData 一起发送到 API
- netsuite - 是否可以在 Netsuite 的 SuiteScript 环境中使用 DOTENV?
- stream - 将视频分析元数据添加到现有的 RTSP 摄像机源
- json - 将 JSON 子对象转换为 Xamarin 表单中的表
- mediawiki - MediaWiki 模板:注意导入不完全正确
- python - Python ABC模块中的abstractclass(metaclass=ABCMeta)和class abstractclass(ABC)有什么区别?
- go - 计算通过网络接收的传入请求的大小
- r - 负载均衡器后面的 R-Shiny 脚本超时
- c++ - 为什么 EnumDomains/NextDomain 永远循环?
- java - DynamoDBMappingException:无法取消转换属性,预期值为 S