题目:
给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。
例如:input[] = {3, 6, 1, 9, 7} output[] = {3, 7, 9, 6, 1}; input[] = {3, 6, 1, 9, 7, 8} output[] = {1, 6, 8, 9, 7, 3}
函数接口 void sort(int input[[, int n, int output[])
基本的方法:
1) 先进行排序,然后挨个放/也可以以2为间隔存放。
第一种方法的时间复杂度根据所选排序算法的不同而不同,空间复杂度为:n;
2) 第一次选出一个最大,放在相应位置;第二次取出剩余最大值,放相应位置;依次类推。
其中,选最大值可以使用最大堆方法来实现(注意,不是堆排序哦)
选择一种好的排序算法的话(比如快排),两者的时间复杂度是差不多的。
以下是我个人的解法(C++程序):
#include<iostream>
using namespace std;
void sort(int input[], int n, int output[])
{
int temp,i,j;
for(i=0;i<n;i++)//冒泡排序
for(int j=0;j<n-i-1;j++)
if(input[j]>input[j+1])
{
temp=input[j];
input[j]=input[j+1];
input[j+1]=temp;
}
/*
for(i=0;i<n;i++)//打印排序后的结果,可不打印
cout<<input[i]<<" ";
cout<<endl;
*/
if(n%2==0)//n为偶数
{
output[n/2]=input[n-1];
output[0]=input[0];
for(i=n/2-1,j=n-2;i>0&&j>0;i--,j=j-2)
output[i]=input[j];
for(i=n/2+1,j=n-3;i<n && j>0;i++,j=j-2)
output[i]=input[j];
}
else//n为奇数
{
output[n/2]=input[n-1];
//output[0]=input[0];
for(i=n/2-1,j=n-2;i>=0&&j>0;i--,j=j-2)
output[i]=input[j];
for(i=n/2+1,j=n-3;i<n && j>=0;i++,j=j-2)
output[i]=input[j];
}
cout<<"output is:"<<endl;
for(i=0;i<n;i++)
cout<<output[i]<<" ";
}
void main()
{
int n,i;
cout<<"input number n:";
cin>>n;
int * input=new int[n];
int *output=new int[n];
for(i=0;i<n;i++)
cin>>input[i];
sort(input,n,output);
cout<<endl;
}