# Sorting# Array# Greedy

c531 - 基礎排序 #1-1 ( 偶數排序 )

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取一行包含逗號分隔的數字字串,將字串中的數字轉換為整數,然後僅對其中的偶數進行排序。排序後,需要將排序後的偶數放回原始位置,保持奇數的位置不變,最後輸出排序後的數字字串。

解題思路

程式首先讀取輸入字串,並將其解析為整數陣列 a。接著,程式遍歷陣列 a,將所有偶數提取到另一個陣列 b 中。然後,對陣列 b 進行排序。最後,程式再次遍歷陣列 a,將排序後的偶數從陣列 b 中放回 a 中,保持奇數的位置不變。最後,程式將陣列 a 中的數字輸出為逗號分隔的字串。

複雜度分析

  • 時間複雜度: O(n log n)
  • 空間複雜度: O(n)

程式碼

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main(){
	int a[50],i=0,b[50];
	string n;
	while(cin >> n){
		for(int j=0;j<n.length();j++){
			int p=0;
			while(n[j]!=','&&j<n.length()){
				p*=10;
				p+=n[j]-48;
				j++;
			}
			a[i]=p;
			i++;
		}
		int k=0;
		if(i==1)
		cout << a[i-1] << "\n";
		else{
			for(int z=0;z<i;z++){
				if(a[z]%2==0){
					b[k]=a[z];
					k++;
				}
			}
			sort(b,b+k);
			k=0;
			for(int z=0;z<i;z++){
				if(a[z]%2==0){
					a[z]=b[k];
					k++;
				}
			}
			for(int ii=0;ii<i;ii++){
				if(ii!=i-1)
				cout << a[ii] << ',';
			}
			cout << a[i-1] <<"\n";
		}
		i=0;
	} 
}

Discussion