實驗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,如下圖所示。)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TWHp1aSdVZoxGSlZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zM2ATOwcDMzIjNxUDM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
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;
}