实验7
1. 对两个无序的数组(其中数组a长度为n,数组b长度m),采用选择法(或起泡法)分别将这两个数组转为有序(元素值从小到大有序)。要求:a和b数组长度及其元素均由键盘获取。
2. 将以上任务1构建的两个有序的数组a和b,进行有序合并,即将这两个数组进行合并的过程中其数据始终保持有序。(提示:数据结构:三个一维数组a,b,c将a[ia]和b[ib]比较,谁小就把谁放入c[ic](c数组用于存放合并后的数据),谁放入了c[ic]中谁的下标就加1,同时ic(c中当前存放数据的下标)加1,如下图所示。)
3. 计算以上任务2中c数组元素的平均值,并删除c中所有低于平均值的那些元素。
#include <iostream>
using namespace std;
int main()
{
//int a[100],b[100];
//a[100] = {0};提示,不能这样初始化,应该采用下面的方式
//b[100] = {0};
int a[100] = {0},b[100] = {0};
int n1,n2,t;
cout << "请输入数组a的个数:";
cin >> n1;
cout << "请依次输入" << n1 << "个整数:"<< endl;
for( int i = 0; i < n1; i++ )
{
cin >> a[i];
}
cout << "对数组a进行排序……" << endl;
/********************************选择法排序*****************************
思路: a[i]与后面的元素a[j](即a[i+1],a[i+2],……,a[n1-1])进行比较,如果
a[i]大于a[j],则交换。须n1-1次循环,每次循环须判断n1-i-1次。第0次
循环后,a[0]为数组a的最小值,第1次循环后,a[1]仅小于a[0],大于其
它元素。第n1-1次循环后,a[n1-1]为最大值。最终完成从小到大的排序。
************************************************************************/
//方式1:
for( int i = 0; i < n1-1; i++ ) //须n1-1次循环
for( int j = i+1; j < n1; j++) //每次循环须判断n1-i-1次
{
if( a[i] > a[j] ) //a[i]大于a[j],则交换
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//方式2:
//for(int i = 0; i < n1-1; i++) //须n1-1次循环
//{
// int min = i;
// for(int j = i+1; j < n1; ++j) //每次循环须判断n1-i-1次
// {
// if( a[min] > a[j]) //a[min]大于a[j],则a[j]为最小值
// min = j;
// }
// t = a[min];
// a[min] = a[i];
// a[i] = t;
//}
/*******************************冒泡法排序******************************
思路: 相邻的两个元素进行比较,如果前者大于后者,则交换,这样较大的元素
就会向后移动,较小的元素向前移动。第0次循环,须两两比较m-1次,结果
a[m-1]为数组a的最大值。第1次循环,须两两比较m-2次,结果a[m-2]仅小
于a[m-1],大于其它元素。第i次循环,须两两比较m-1-i次。第m-1次循环后,
a[0]为最小值。最终完成从小到大的排序。
************************************************************************/
//冒泡法:
//for( int i = 0; i < n1-1; i++ ) //须n1-1次循环
// for( int j = 0; j < n1-i-1; j++) //每次循环须判断n1-i-1次
// {
// if( a[j] > a[j+1] ) //a[j]大于a[j+1],则交换
// {
// t = a[j];
// a[j] = a[j+1];
// a[j+1] = t;
// }
// }
//测试用
//for( int i = 0; i < n1; i++ )
//{
// cout << a[i] << ' ';
//}
//cout << endl;
/******************************************************/
cout << "请输入数组b的个数:";
cin >> n2;
cout << "请依次输入" << n2 << "个整数:"<< endl;
for( int i = 0; i < n2; i++ )
{
cin >> b[i];
}
cout << "对数组b进行排序……" << endl;
for( int i = 0; i < n2; i++ )
for( int j = i+1; j < n2; j++)
{
if( b[i] >b[j] )
{
t = b[i];
b[i] = b[j];
b[j] = t;
}
}
/******************第二题**************/
int c[100];
int i = 0, j = 0, k = 0;
int n3 = 0;//记录数组c的个数
while( i < n1 && j < n2 )
{
if( a[i] < b[j] )
{
c[k++] = a[i++];
}
else if( a[i] == b[j] )
{
c[k++] = a[i++];
c[k++] = b[j++];
}
else
{
c[k++] = b[j++];
}
}
while( n1 > i && n2 == j )
{
c[k++] = a[i++];
}
while( n2 > j && n1 == i )
{
c[k++] = b[j++];
}
n3 = k;
cout << "对数组a和数组b进行组合,得数组c为:" << endl;
//检查结果
for( k = 0; k < n3; k++ )
cout << c[k] << ' ';
cout << endl;
/******************第三题**************/
int sum = 0;//sum记录数组c所有元素的和,及平均值
int n4 = 0;//n4记录新数组c的个数
for( k = 0; k < n3; k++ )
sum += c[k];//求和
sum /= n3;//求均值
cout << "数组c平均数:" << sum << endl;
cout << "对数组c进行筛选……" << endl;
for( k = 0; k < n3; k++ )
{
if( c[k] >= sum )
{
n4 = n3 - k;
break;
}
}
for( int m=0; k < n3; k++,m++)
{
c[m] = c[k];
}
cout << "数组c筛选后为:" << endl;
for( int k = 0; k < n4; k++)
{
cout << c[k] << ' ';
}
cout << endl;
return 0;
}