仅通过交换元素来对列表进行排序

时间:2017-05-24 20:17:41

标签: c# python sorting

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

提前谢谢

3 个答案:

答案 0 :(得分:0)

您要搜索的是排序算法。

https://brilliant.org/wiki/sorting-algorithms/

一个好的是“QuickSort”结合更简单的排序算法,如“BubbleSort”

Ted-Ed也有一个关于这个主题的好视频: https://www.youtube.com/watch?v=WaNLJf8xzC4

答案 1 :(得分:0)

找到这个问题的答案的最佳方法可能是打开您最喜欢的搜索引擎,并在那里将标题添加到您的问题中。你会发现很多结果,包括:

通读这些并找到仅使用交换元素进行排序的算法(因为这是您的要求)。您还可以阅读有关算法性能的信息(因为这是要求的另一部分)。

请注意,某些内容的执行速度会快于其他内容,具体取决于数组的大小和排序方式。

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

  

<强>说明

     
    

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

            

现在我们看到,对于小分区(如15个元素的示例),专业人员使用insertion sort

答案 2 :(得分:0)

对于大小为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]]);
}

对于更通用的解决方案并假设只计算用于对原始数组进行排序的交换,生成要排序的数组的索引数组,根据要排序的数组对索引数组进行排序(使用任何排序算法),然后使用上面的算法同时对原始数组和索引数组进行排序。使用C ++来描述这个,并在这个例子中使用lambda比较:

void sort(int A[], int n)
{
    // generate indices I[]
    int *I = new int[n];
    for(int i = 0; i < n; i++)
        I[i] = i;
    // sort I according to A
    std::sort(I, I+n,
        [&A](int i, int j)
          {return A[i] < A[j];});
    // sort A and I according to I using swaps
    for(int i = 0; i < n; i++){
        while(I[i] != i){
            std::swap(I[i], I[I[i]]);
            std::swap(A[i], A[A[i]]);   // only this swap is counted
        }
    }
    delete[] I;
}

对于没有lambda commpare等效语言的语言,可以使用自定义排序函数。排序完成撤消&#34;周期&#34;在具有O(n)时间复杂度的阵列中。阵列的每个排列都可以被认为是一系列循环。值实际上是元素的顺序,但在这种情况下,顺序和值是相同的:

index  0 1 2 3 4 5 6 7
value  6 3 1 2 4 0 7 5

周期是&#34;路径&#34;要跟随一串值,从索引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

链接到根据其中一个排序多个数组的更实际的例子。在此示例中,循环使用一系列移动而不是交换来完成:

Sorting two arrays based on one with standard library (copy steps avoided)