我想出来了一个排序算法,思路为:
每次遍历数组,找到数组里未被标记过的最大值和最小值,将他们分别放在答案数组的两端,标记这两个数,然后将答案数组的赋值范围缩小,并标记这两个数,循环直到所有书都被标记
代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[100005],b[100005],vis[100005],l,r;
int main() {
cin>>n;
for(int i=1; i<=n; i++)cin>>a[i];
l=1,r=n;
while(1) {
int mx=1,mn=1,f=0;
for(int i=2; i<=n; i++) {
if(a[mx]<=a[i]&&!vis[i])
mx=i;
if(a[mn]>=a[i]&&!vis[i])
mn=i;
}
for(int i=1; i<=n; i++)
if(!vis[i])
f=1;
if(!f)break;
vis[mn]=vis[mx]=1;
b[l]=a[mn],b[r]=a[mx];
l++,r--;
}
for(int i=1;i<=n;i++)
cout<<b[i]<<" ";
return 0;
}
这个程序可以完成:
输入:
5
1 2 3 2 1
输出:
1 2 2 3 3
但不可以:
输入:
5
1 4 2 5 3
输出:
1 2 3 1 5
代码或思路求条,悬一关。