如何根据任意顺序对列表进行排序

时间:2018-11-08 09:49:49

标签: algorithm sorting

我搜索了一个相关问题,但找不到。所以我的问题是如何根据任意顺序对数组进行排序。例如,假设顺序为:

order_of_elements = ['cc', 'zz', '4b', '13']

和我要排序的列表:

list_to_be_sorted = ['4b', '4b', 'zz', 'cc', '13', 'cc', 'zz']

所以结果必须是:

ordered_list = ['cc', 'cc', 'zz', 'zz', '4b', '4b', '13']

请注意,参考列表(order_of_elements)描述了排序,我不问根据参考列表的字母排序索引进行排序的问题。

您可以假设order_of_elements数组包含所有可能的元素。

欢迎使用任何伪代码。

3 个答案:

答案 0 :(得分:2)

完成此操作的一种简单且Pythonic的方式是为order_of_elements数组计算索引查找表,并将索引用作排序键:

order_index_table = { item: idx for idx, item in enumerate(order_of_elements) }
ordered_list = sorted(list_to_be_sorted, key=lambda x: order_index_table[x])

该表将订单查找减少为O(1)(分期偿还),因此不会改变排序的时间复杂度。

(当然,它会假设list_to_be_sorted中的所有元素都存在于order_of_elements中;如果不一定是这种情况,则需要在键lambda中使用默认的返回值。)

答案 1 :(得分:1)

由于可能的元素数量有限,并且如果这些元素是可哈希的,则可以使用一种计数排序。

将哈希表中order_of_elements的所有元素作为键,并将计数器作为值。遍历list_to_be_sorted,增加与当前元素相对应的计数器。要构建ordered_list,请遍历order_of_elements,然后将每个当前元素添加该元素的计数器指示的次数。

hashmap hm;
for e in order_of_elements {
    hm.add(e, 0);
}

for e in list_to_be_sorted {
    hm[e]++;
}

list ordered_list;
for e in order_of_elements {
    list.append(e, hm[e]); // Append hm[e] copies of element e
}

答案 2 :(得分:0)

方法:

  1. 创建一个辅助数组,其中将保留“ order_of_elements”的索引
  2. 对辅助数组进行排序。

    2.1在排序辅助数组时重新排列主数组中的值