问题描述:
假设有数量为 2n 的一排碟子,n 黑 n 白交替放置:黑、白、黑、白、黑、…。现在要把
黑碟子都放在右边,白碟子都放在左边,但只允许通过互换相邻碟子的位置来实现,为该
谜题写个算法,并确定该算法需要执行的换位次数
//假设有数量为 2n 的一排碟子,n 黑 n 白交替放置:黑、白、黑、白、黑、......。
//现在要把黑碟子都放在右边,白碟子都放在左边,但只允许通过互换相邻碟子的位置来实现,
//为该谜题写个算法,并确定该算法需要执行的换位次数。
#include<iostream>
using namespace std;
int main(){
int saucerNumber;
//输入 数量为 2n 的一排碟子,n 黑 n 白交替放置
cout<<"请输入一个偶数用来表示碟子数: ";
cin>> saucerNumber;
cout<<endl;
//定义一个数组,用来存储数据
int saucerArray[saucerNumber];
int count=0; // 记录算法需要执行的换位次数。
// 数组赋值------n 黑 n 白交替放置:黑、白、黑、白、黑、......
for(int i=0;i<saucerNumber-1;i+=2){
saucerArray[i]=1;
saucerArray[i+1]=0;
}
//显示未排序之前的数组元素
cout<<"排序之前的数组元素显示如下:" <<endl;
for(int i=0;i<saucerNumber;i++){
cout<<saucerArray[i]<<" ";
}
cout<<endl;
//通过互换相邻碟子的位置来实现 黑碟子都放在右边,白碟子都放在左边
//方法思路 (相邻元素为一组,然后分组操作元素互换) ---这个方法的时间复杂度不简便
int temp;
for(int i=1;i<saucerNumber/2;i++){ // saucerNumber个元素,分为 saucerNumber/2组,从第一组开始进行元素互换的操作,共saucerNumber/2-1 组
for(int j=i;j<saucerNumber-1;j+=2){ //从第i个元素开始配对, i和i+1 为一组 ,然后分组进行元素互换
temp=saucerArray[j];
saucerArray[j]=saucerArray[j+1];
saucerArray[j+1]=temp;
count++;
}
}
cout<<"排序之后的数组元素显示如下:" <<endl;
for(int i=0;i<saucerNumber;i++){
cout<<saucerArray[i]<<" ";
}
cout<<endl;
cout<<"需要执行的换位次数为: "<<count<<"次!"<<endl;
return 0;
}