/* 2 * 给定一个数组input[] ,如果数组长度n为奇数, 3 * 则将数组中最大的元素放到 output[] 数组最中间的位置, 4 * 如果数组长度n为偶数,则将数组中最大的元素放到 5 * output[] 数组中间两个位置偏右的那个位置上, 6 * 然后再按从大到小的顺序,依次在第一个位置的两边, 7 * 按照一左一右的顺序,依次存放剩下的数。 8 */
直接贴代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAXINT pow(2,8*sizeof(int))-1
void sort(int n, int input[], int output[]);
int main(){
int n,i;
printf("How many numbers do you want to input\n");
scanf("%d",&n);
int *input=(int *)malloc(n*sizeof(int)); //为input开辟数组空间
int *output=(int *)malloc(n*sizeof(int)); //为output开辟数组空间
for(i=0;i<n;i++) {
scanf("%d",&input[i]);
if(input[i]>MAXINT ||input[i]<0-MAXINT-1){
printf("The input number is too large!\n");
return 0;
}
}
sort(n,input,output);
for(i=0;i<n;i++){
printf("%d ",output[i]);
}
printf("\n");
}
void sort(int n, int input[], int output[]){
if(n<0||NULL==input) {
printf("The args of function are not correct\n");
return;
}
//首先对input从大到小排序
int i,j,mid;
for(i=0;i<n-1;i++) {
for(j=0;j<n-i-1;j++){
if(input[j]<input[j+1]){
input[j]=input[j]^input[j+1];
input[j+1]=input[j]^input[j+1];
input[j]=input[j]^input[j+1];
}
}
}
mid=n/2; //不管是奇数还是偶数,这个都是成立的。对于奇数就是中间位置,对于偶数就是中间两个偏右的位置
int midadd=mid;
int middes=mid-1; //易错地方,要减去1!!! ,不然中间位置被写两次!
for(i=0;i<n;i++){ //从中间位置向两边安置input中的元素
if(i%2==0){
output[midadd++]=input[i]; //下标为偶数的依次安置在右边
} else{
output[middes--]=input[i]; //下标为奇数的依次安置在左边
}
}
}