【问题标题】:Restore original array after selection sort using swap distances使用交换距离选择排序后恢复原始数组
【发布时间】:2020-10-22 20:22:04
【问题描述】:

我是 CS 新手,我的任务非常艰巨。这让我害怕。 在选择排序期间,我们可以获得交换距离——(未排序数组中元素的索引值)和(排序数组中元素的索引值)之间的差异。我们可以像这样找到它(这里是交换距离的总和(我写的代码,计算交换距离的总和是我之前的任务),但是我们可以很容易地获得交换距离的列表):

x = [int(i) for i in input().split()]
def sel_sort(a):
    swap_dist_sum = 0 
    for i in range(len(a)): 
        min_idx = i 
        for j in range(i+1, len(a)): 
            if a[min_idx] > a[j]: 
                min_idx = j       
        a[i], a[min_idx] = a[min_idx], a[i]
        swap_dist_sum += (min_idx - i)  # new index in sorted list - index from unsorted list
    return swap_dist_sum                # for each element
print(sel_sort(x))

这只是介绍(这个定义很少见)。 我有 (n - 1) 个数字,它们是交换距离;第一次排序迭代中的第一个元素,第二次中的第二个元素,依此类推。我必须在 n 个元素的未排序数组中恢复元素的原始顺序。 我不知道我应该做什么。也许您可以建议我查找/阅读/使用库/小代码提示/等。

Sample Input:  # swap distances
1 3 0 1
Sample Output:  # original list
4 1 3 5 2

我的第一步应该是这样的:

swap_dist_l = [int(i) for i in input().split()]  # list containing all swap distances
sorted_l = [i for i in range(1, len(swap_dist_l) + 2)]  # already sorted list

因此,我应该拥有带有原始未排序元素顺序的 unsorted_l。 对不起,如果我的演讲难以理解! 附言我没有发现任何类似/重复的问题。如果我不擅长搜索,请发送链接!

【问题讨论】:

标签: python arrays algorithm sorting selection-sort


【解决方案1】:

你应该执行与你得到的交换距离相对应的交换,但顺序相反,所以从右边开始:

def unsort(data_l, swap_dist_l):
    for i, dist in reversed(list(enumerate(swap_dist_l))):
        # swap
        data_l[i+dist], data_l[i] = data_l[i], data_l[i+dist]

给定的例子如下调用:

swap_dist_l = [1, 3, 0, 1]
data_l = [i for i in range(1, len(swap_dist_l) + 2)]  # [1, 2, 3, 4, 5] 
unsort(data_l, swap_dist_l)
print(data_l)  # [4, 1, 3, 5, 2]

【讨论】:

  • 哇!如此优雅的解决方案!你做的比我要求的还要多。之前没有使用 enumerate() 的经验。这是一个很好的学习新事物的动力。再次非常感谢!
【解决方案2】:

让我们看看选择排序如何处理一个简单的列表lst = [3,1,2]

我们首先查看索引 0,并在索引 1 处找到最小元素 1。

然后我们交换这些,即lst[0], lst[1] = lst[1], lst[0]

然后我们查看索引 1 并在索引 2 处找到最小元素 2。

然后我们交换这些,即lst[1], lst[2] = lst[2], lst[1]

现在列表已排序,我们有一个交换距离列表swap_dst = [1,1]

为了恢复列表,我们需要反转我们所做的交换以使其排序,或者换句话说,我们需要再次执行相同的交换,但顺序相反。

lst = [1,2,3]
lst[1], lst[2] = lst[2], lst[1]
lst[0], lst[1] = lst[1], lst[0]
print(lst) # [3,1,2]

因此,您需要做的是找出如何使用交换距离来找到进行了哪些交换并再次进行这些交换。

【讨论】:

  • 您好!谢谢你的建议!
猜你喜欢
  • 2022-06-18
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 2013-11-05
  • 2013-04-30
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多