题意是:
给出一个数组,取其中两个数,如果这两个数之和是奇数,那么可以将这两个数交换(不是必须)。求可以得到的字典顺序最小的数组。
其中一个数组比另一个数组字典顺序小的判断依据是存在一个下标 i 使得
xi<yi
并且
xj=yj(1≤j<i)
思路:
这里其实有一个很大的诱导点,就是交换的条件。其实只要不是全奇或者全偶,那么一个数可以在整个数组中的任意的位置。
那么根据第二个判断条件,可以明显知道是一个递增数组。所以
判断是不是全奇或者全偶,如果是就直接输出,不是就进行升序(考虑到数组较大,用折半插入排序)排序后输出。
代码:
检测函数
bool check(int n){
bool allOdd = true; //奇数
bool allEven = true; //偶数
for(int i = 0; i < n; i++){
if(Array[i] % 2 != 0){
allEven = false;
break;
}
}
for(int i = 0; i < n; i++){
if(Array[i] % 2 == 0){
allOdd = false;
break;
}
}
if(!allOdd && !allEven){
return true;
} else{
return false;
}
}
排序函数
int low,high,middle;
void BinaryInsertSort(int len){
for(int i=0;i<len;i++){
int temp=Array[i];
low=0;high=i-1;
while(low<=high){
middle=(low+high)/2;
if(temp<Array[middle]){
high=middle-1;
}
else{
low=middle+1;
}
}
for(int k=i;k>low;k--){
Array[k]=Array[k-1];
}
Array[low]=temp;
}
}
主函数
int main(){
int n, index, temp;
while(cin >> n && n >= 1){
for(int i = 0; i < n; i++){
cin >> Array[i];
}
if(check(n)){
BinaryInsertSort(n);
}
for(int i = 0; i < n-1; i++){
cout << Array[i] << " ";
}
cout << Array[n-1] << endl;
}
return 0;
}