描述
已有一个已排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中。
原来排序的规律分有顺序和逆序。
输入
第一行,原始数列。第二行,需要插入的数字。
输出
排序后的数列
输入样例 1
1 7 8 17 23 24 59 62 101 50
输出样例 1
1 7 8 17 23 24 50 59 62 101
输入样例 2
1 2 3 4 5 6 7 8 9 7
输出样例 2
1 2 3 4 5 6 7 8 9
输入样例 3
90 80 70 39 28 27 26 25 20 50
输出样例 3
90 80 70 50 39 28 27 26 25 20
输入样例 4
100 90 80 70 60 50 40 30 20 10
输出样例 4
100 90 80 70 60 50 40 30 20 10
代码一(如下):
#include <iostream>
using namespace std;
int main()
{
int a[11];
int i,j;
for (i = 1; i < 10; i++)
{
cin >> a[i];
}
int x;
cin >> x;
a[10] = x;
if (a[1] < a[2])
{
for (i = 1; i <= 9; i++)
for (j = 1; j <= 10 - i; j++)
{
if (a[j] > a[j + 1])
{
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
for (i = 1; i < 11; i++)
{
cout << a[i] << endl;
}
}
else
{
for (i = 1; i <= 9; i++)
for (j = 1; j <= 10 - i; j++)
{
if (a[j] < a[j + 1])
{
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
for (i = 1; i < 11; i++)
{
cout << a[i] << endl;
}
}
return 0;
}
代码二(如下):函数调用
#include <iostream>
using namespace std;
void shunxv(int a[]);
void nixv(int a[]);
int main()
{
int a[11];
int i;
for (i = 1; i < 10; i++)
{
cin >> a[i];
}
int x;
cin >> x;
a[10] = x;
if (a[1] < a[2])
{
shunxv(a);
}
else nixv(a);
return 0;
}
void shunxv(int a[])
{
int i,j;
int t;
for (i = 1; i <=9; i++)
for (j = 1; j <= 10 - i; j++)
{
if (a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
for (i = 1; i < 11; i++)
{
cout << a[i] << endl;
}
}
void nixv(int a[])
{
int i, j;
int t;
for (i = 1; i <= 9; i++)
for (j = 1; j <= 10 - i; j++)
{
if (a[j] < a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
for (i = 1; i < 11; i++)
{
cout << a[i] << endl;
}
}
其实就是冒泡排序问题的变种,但是用冒泡排序总感觉过程有些复杂化了,不知道有没有更简洁更直接的算法。
问题点:
将数组传递给自定义函数:
1、函数定义时:
1)函数原型必须定义参数是一个数组,不能定义成普通变量,如可以写成 int *a 或 int a【】;
2)形参类型必须与数组的相同,如都是int类型;
3)数组的大小不必指定,如直接写 a【】;
2、函数调用时只需传递数组名。如上述代码中的 shunxv(a)。
调用函数的时候,传入的是数组的首地址。而不能用 shunxv(a【i】),否则我们传入的就不是该数组的首地址了,而是该数组a的第 i 个数据。
C++实际上只把形参数组名作为一个指针变量来处理,用来接受从实参传过来的地址。