C# 仅通过交换列表对其进行排序';s元素

C# 仅通过交换列表对其进行排序';s元素,c#,python,sorting,C#,Python,Sorting,以下问题的最佳解决方案是什么: 给定一个值列表(fe:数值范围为0-14),您将如何仅使用交换操作(fe:交换列表中的第0和第9个元素)对其进行排序?您的目标是找到交换最少的解决方案 提前感谢您您正在搜索的是排序算法 一个很好的方法是“快速排序”与一个更简单的排序算法(如“BubbleSort”)相结合 Ted Ed也有一段关于该主题的精彩视频: 找到这个问题答案的最好方法可能是打开你最喜欢的搜索引擎,把你问题的标题放在那里。您将发现许多结果,包括: (其中包括一节) 通读这些内容,找出

以下问题的最佳解决方案是什么: 给定一个值列表(fe:数值范围为0-14),您将如何仅使用交换操作(fe:交换列表中的第0和第9个元素)对其进行排序?您的目标是找到交换最少的解决方案


提前感谢您

您正在搜索的是排序算法

一个很好的方法是“快速排序”与一个更简单的排序算法(如“BubbleSort”)相结合

Ted Ed也有一段关于该主题的精彩视频:

找到这个问题答案的最好方法可能是打开你最喜欢的搜索引擎,把你问题的标题放在那里。您将发现许多结果,包括:

  • (其中包括一节)
通读这些内容,找出只使用元素交换进行排序的算法(因为这是您的要求)。您还可以阅读算法的性能(因为这是需求的另一部分)

请注意,根据数组的大小和排序方式,某些数组的执行速度会比其他数组快


另一种解决方法是问自己,“专业人士是做什么的?”。这可能会导致您阅读的文档,这是我们大多数人在需要快速排序数组时使用的内置机制。您将在此处找到以下信息:

备注

此方法使用自省排序(introsort)算法,如下所示:

  • 如果分区大小小于16个元素,则使用算法
  • 如果分区数超过2*LogN,其中N是输入数组的范围,则它使用一个
  • 否则,它将使用

现在我们看到,对于小分区(如您的示例中的15个元素),pros使用

假设大小为n的数组的值为0到n-1,这里有一个时间复杂度为O(n)的算法,它应该是最小化交换的最佳算法。每次交换都会在其正确位置放置至少一个值(有时两个值)

// the values of A[] range from 0 to n-1
void sort(int A[], int n)
{
    for(int i = 0; i < n; i++)
        while(A[i] != i)
            swap(A[i], A[A[i]]);
}
这些循环是沿着价值链的“路径”,从索引0(其值为6)开始,然后转到索引6(其值为7)并重复该过程,直到循环在索引0处完成。对阵列的其余部分重复此操作。对于本例,周期为:

0->6  6->7  7->5  5->0
1->3  3->2  2->1
4->4
按照上述算法,交换为:

swap(a[0],a[6])  // puts 6 into place
swap(a[0],a[7])  // puts 7 into place
swap(a[0],a[5])  // puts 0 and 5 into place
swap(a[1],a[3])  // puts 3 into place
swap(a[1],a[2])  // puts 1 and 2 into place
                 // done
链接到根据其中一个数组对多个数组进行排序的更实际的示例。在本例中,使用一系列移动而不是交换来完成周期:


用or解决家庭作业。是否保证数组中的项实现了
IComparable
接口?这是C#还是python问题?不要标记垃圾邮件。而且,这个问题真的没有那么重要。我们不会通过为人们做家庭作业来实现懒惰……虽然“懒惰”听起来可能有贬义,但它实际上意味着我们希望你真正学到一些东西,并尽可能做到最好,如果你不先尝试一些事情,这是不会发生的。当你陷入困境时,请回到这里,我们会张开双臂欢迎你。从技术上讲,我认为Quicksort不符合“仅使用交换操作”的要求。谢谢!我想知道你能否解释一下“sort
I
A
中的意思。这是否仅仅意味着对于所有
i
,A[i]==A[i[i]对于所有
i
?我试图用Python实现一个通用的解决方案,所以我不太理解std::sort(I,I+n,[&a](inti,intj){返回a[I]正在执行。@BerkU.-“根据A[]对I[]进行排序”是指根据A[]对I[]进行排序后,对于I=1到n-1,A[I[I-1]]
0->6  6->7  7->5  5->0
1->3  3->2  2->1
4->4
swap(a[0],a[6])  // puts 6 into place
swap(a[0],a[7])  // puts 7 into place
swap(a[0],a[5])  // puts 0 and 5 into place
swap(a[1],a[3])  // puts 3 into place
swap(a[1],a[2])  // puts 1 and 2 into place
                 // done