选择排序中如何打印元素索引 现有实现代码不生效问题求解
选择排序过程中获取元素原索引的解决方案
问题原因
- 你在排序逻辑中直接修改了传入的数组A,排序完成后A的元素位置已经和原数组完全不同,此时调用
A.index(i)只能拿到元素在排序后数组的位置,自然是连续的0、1、2序列,不符合需求。 - 就算你保留了原数组的拷贝,如果数组存在重复元素,
index()方法只会返回第一个匹配值的索引,依然会得到错误结果。 - 不需要使用deepcopy解决这个问题,调整索引记录的时机即可。
优化后代码
def solve(A): # 绑定元素值和对应的原始索引,避免修改原数组后丢失索引信息 indexed_list = [(val, origin_idx) for origin_idx, val in enumerate(A)] sorted_values = [] origin_index_sequence = [] for i in range(len(indexed_list)): min_idx = i for j in range(i+1, len(indexed_list)): if indexed_list[min_idx][0] > indexed_list[j][0]: min_idx = j # 交换元素 indexed_list[i], indexed_list[min_idx] = indexed_list[min_idx], indexed_list[i] # 同步保存排序后的值和对应原始索引 sorted_values.append(indexed_list[i][0]) origin_index_sequence.append(indexed_list[i][1]) # 第一个返回值是排序后的数组,第二个返回值就是你需要的原索引序列 return sorted_values, origin_index_sequence
实现说明
- 排序逻辑基于绑定了原始索引的元组列表执行,比较时仅取元组第一个元素(原数值)进行判断,完全保留原有选择排序的逻辑特性。
- 每次交换完成后直接从元组中提取原始索引,不需要后续回溯查询,不存在重复元素匹配错误的问题。
- 如果你需要保留原数组不被修改,本方案不需要对原数组做任何拷贝操作,仅基于新生成的元组列表完成排序即可。
内容的提问来源于stack exchange,提问作者Maws
相关产品推荐
相关产品推荐

