首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果可以交换两个大小相等的子数组,则对数组进行排序的交换操作的最小数目

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

Stack Overflow用户
提问于 2015-02-26 11:44:18
回答 1查看 1.6K关注 0票数 5

给定一个正整数的数组A1.N,您必须在每个操作中按照的方式按升序排序,选择任意两个不重叠的等长子数组并交换它们。即选择两个子数组Ai.(i+k-1)Aj.(j+k-1),使i+k-1< jAiAjE 213交换,Ai+1与E 114Aj+1<代码>E 215.Ai+k-1 + Aj+k-1.

代码语言:javascript
复制
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/

EN

回答 1

Stack Overflow用户

发布于 2015-03-17 07:55:20

代码语言:javascript
复制
#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;
}

逻辑:在每个操作中找到max元素,然后执行交换,这样最大的元素就会结束。执行此操作,每次减少N次数组大小1次,并在每次操作中都有最大元素。没有必要进行N次互换。只有当max元素不在它的位置时,它才执行交换。T= O(n2)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28741575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档