封装一个函数,利用冒泡排序,实现对整型数组的升序排序
只要传输了数组的首地址,即等于把数组传输进了函数
我的方法(在main函数中进行冒泡排序,每次传输数组中两个数的地址到子函数,然后两个指针的解引用比大小,再互换)
void seq(int *a,int *b ) //定义两个指针,方便接收传输的地址
{
cout << *a << " " << endl; //检测传输过来的地址有没有问题
cout << *b << " " << endl;
if (*a > *b) //冒泡排序的互换
{
int temp = *b;
*b = *a;
*a = temp;
}
cout << *a << " " << endl; //检测指针的解引用是否有问题
cout << *b << " " << endl;
}
int main()
{
int arr[10] = {100,54,88,675,4,0,3030,92,654,300};
int len = sizeof(arr) / sizeof(arr[0]); //冒泡排序最好写这个
for (int i = 0; i < len; i++)
{
int *p1 = arr; int *p2; int *p3; //重点:这里的指针定义必须放在第一个循环里,让p1重新等于首地址
//不然,在i=1的第二个循环中,p3会是数组最后一位,而p2会是
//数组最后一位往后退4个字节,下标不符,变为极大的负数,使数组溢出
for (int j = 0; j < len-1-i; j++)
{
p3 = p1; //如果不设p3,p1和p2代表的地址会相同
p2 = ++p1; //++a是先加1后等式,a++是先等式后加1
seq(p3,p2); //这里的p都代表的数组地址,因为是整型数组。p1代表首地址
//p1++即为首地址向后4个字节,就是第二个数的地址
//这里将数组两个数的地址传输到子函数的指针上
cout << "i = " << i << endl; //检查在第几次循环中出了问题
}
}
for (int k = 0; k < 10; k++)
{
cout << arr[k] << " ";
}
system("pause");
return 0;
}
纠错时应一个部分一个部分的看输出是否正确,修改起来会很方便
老师方法(直接将数组传到子函数,然后在子函数中进行冒泡排序)
void seq(int *arr,int len ) //定义了一个指针接收地址,只要传输了数组的首地址,便可
在子函数中使用数组
{
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len - i - 1; j++) //冒泡排序标准操作
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
}
int main()
{
int arr[10] = { 1,54,88,675,4,0,3030,92,654,300 };
int len = sizeof(arr) / sizeof(arr[0]); //冒泡排序使用
seq(arr,len); //arr即为数组的首地址,这里传输的是地址
for (int k = 0; k < 10; k++)
{
cout << arr[k] <<" ";
}
system("pause");
return 0;
}