今天在学习冒泡算法时需要用到交换
private static void BubbleSort(int[] a ){
int temp = 0;
for (int p = 1;p<a.length;p++) {
for (int i = 0;i<a.length-1;i++) {
if (a[i+1]<a[i]) {
temp = a[i+1];
a[i+1] = a[i];
a[i] = temp;
// swap(a[i+1],a[i]);
}
}
}
}
private static void BubbleSort(int[] a ){
int temp = 0;
for (int p = 1;p<a.length;p++) {
for (int i = 0;i<a.length-1;i++) {
if (a[i+1]<a[i]) {
temp = a[i+1];
a[i+1] = a[i];
a[i] = temp;
// swap(a[i+1],a[i]);
}
}
}
}
可以看到其中我注释掉了swap,因为我在同一个类中还写了一个swap方法
private static void swap(int a,int b){
int temp = 0;
temp = a;
a = b;
b = temp;
}
但是当我调用swap方法(而不是直接在排序内部写好的方法交换)时,并没有对数组进行排序,而在DEBUG可以看到,Swap()中的a,b的确是发生交换了
private static void swap(int a,int b){
int temp = 0;
temp = a;
a = b;
b = temp;
}
这个就是按值传递和按地址传递的区别
值传递过程中,被调函数的形参作为被调函数的局部变量处理,即在内存的堆栈中开辟空间以存放由主调函数放进来的实参的值,从而成为了实参的一个拷贝。值传递的特点是被调函数对形参的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
而在地址传递过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
所以只要将swap修改为
private static void swap(int[] c,int a,int b){
int temp = 0;
temp = c[a];
c[a] = c[b];
c[b] = temp;
}
private static void swap(int[] c,int a,int b){
int temp = 0;
temp = c[a];
c[a] = c[b];
c[b] = temp;
}