如何实现随机数组中第i大的数与第i小的数进行原地交换,其中0<=i<=n/2,所有i均要完成交换?
把数组复制一份,对数组进行排序,找出第i大与第i小的数,在原来的数组中找出它们然后进行交换就可以了
第一步:将第i大的数与第i小的数相加,然后将结果存入第i大元素的位置;
第二步:取第i大元素位置的数,然后减去第i小元素位置的数,并将结果存入第i小元素位置;
第三步:取第i大元素位置的数,然后减去第i小元素位置的数,并将结果存入第i大元素的位置;
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
int v,d;
};
node a[1000];
int n,p;
bool cmp1(node a,node b)
{
return a.d<b.d;
}
bool cmp2(node a,node b)
{
return a.v<b.v;
}
int main()
{
scanf("%d%d",&n,&p);
for(int i=0;i<n;i++)
{
a[i].d=i;
scanf("%d",&a[i].v);
}
sort(a,a+n,cmp2);
int t=a[p-1].v;
a[p-1].v=a[n-p].v;
a[n-p].v=t;
sort(a,a+n,cmp1);
for(int i=0;i<n;i++) printf("%d ",a[i].v);
return 0;
}
```#include<algorithm>
```using namespace std;
```struct node
```{
``` int v,d;
```};
```node a[1000];
```int n,p;
```bool cmp1(node a,node b)
```{
``` return a.d<b.d;
```}
```bool cmp2(node a,node b)
```{
``` return a.v<b.v;
```}
```int main()
```{
``` scanf("%d%d",&n,&p);
``` for(int i=0;i<n;i++)
``` {
``` a[i].d=i;
``` scanf("%d",&a[i].v);
``` }
``` sort(a,a+n,cmp2);
``` int t=a[p-1].v;
``` a[p-1].v=a[n-p].v;
``` a[n-p].v=t;
``` sort(a,a+n,cmp1);
``` for(int i=0;i<n;i++) printf("%d ",a[i].v);
``` return 0;
```}
```ruby c++
#include
#include
using namespace std;
struct node
{
int v,d;
};
node a[1000];
int n,p;
bool cmp1(node a,node b)
{
return a.d<b.d;
}
bool cmp2(node a,node b)
{
return a.v<b.v;
}
int main()
{
scanf("%d%d",&n,&p);
for(int i=0;i<n;i++)
{
a[i].d=i;
scanf("%d",&a[i].v);
}
sort(a,a+n,cmp2);
int t=a[p-1].v;
a[p-1].v=a[n-p].v;
a[n-p].v=t;
sort(a,a+n,cmp1);
for(int i=0;i<n;i++) printf("%d ",a[i].v);
return 0;
}
用STL,佷方便:
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
int v,d;
};
node a[1000];
int n,p;
bool cmp1(node a,node b)
{
return a.d<b.d;
}
bool cmp2(node a,node b)
{
return a.v<b.v;
}
int main()
{
scanf("%d%d",&n,&p);
for(int i=0;i<n;i++)
{
a[i].d=i;
scanf("%d",&a[i].v);
}
sort(a,a+n,cmp2);
int t=a[p-1].v;
a[p-1].v=a[n-p].v;
a[n-p].v=t;
sort(a,a+n,cmp1);
for(int i=0;i<n;i++) printf("%d ",a[i].v);
return 0;
}