如果可以交换两个相同大小的子数组,则对数组进行排序的最小交换操作数

时间:2015-02-26 11:44:19

标签: arrays algorithm sorting

给定数组 A [1 ... N] 的正整数,您必须按以下方式按升序对其进行排序在每个操作中,选择任何2个相等长度的非重叠子阵列并交换它们。即,选择两个子阵列 A [i ...(i + k-1)] A [j ...(j + k-1)] 这样 i + k-1< j 并将 A [i] A [j] 交换,A [i + 1]与 A [j + 1] ... A [i + k-1] A [j + k-1]

Example:
For N=6
6 7 8 1 2 3
Only one operation is needed as after swapping (6 7 8) and (1 2 3 ) sub arrays
we can get 1 2 3 6 7 8 , that is sorted.

我们如何才能以最有效的方式确定最低交换数量? 消息来源: https://www.hackerearth.com/problem/approximate/swap-and-sort/

1 个答案:

答案 0 :(得分:0)

#include <iostream>
using namespace std;

void swaparr(int a[],int l,int r,int n) {
    for(int i=l,j=r;i<=l+n&&j<=r+n;i++,j++)
        swap(a[i],a[j]);
}
int findMax(int a[],int n) {
    int index = 0;
    for(int i=1;i<=n;i++)
        if(a[i] > a[index])
            index = i;
    return index;
}
void sort(int a[],int n) {
    for(int r=n-1;r>;0;r--) {
        int index = findMax(a,r);
        if(index != r) {
            int l = min(r-index-1,index);
            swaparr(a,index-l,r-l,l);
        }
    }
}
int main() {
    int a[] = {7,23,8,234,3,6,41,334};
    int n = 8;
    sort(a,n);
    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
    return 0;
}

逻辑:在每个操作中找到最大元素并执行该交换,使最大元素到达结尾。 执行此操作N次,每次减少一次数组大小,并在每次操作中确定最大元素。 进行N交换并不是必需的。仅当max元素不在其位置时,它才执行交换。 T = O(n2)