[英]Selection Sort | c++
嗨,我是 c++ 的新手,我已经写了一个选择排序程序,你能帮我说一下交换 function 为什么我们放星星(*),在 selectionSort 我们应该在 <<swap(&arr[min], &arr[i]);>> 我的意思是我们不能说:
int newint = a;
a = b;
b = newint;
代替:
int newint = *a;
*a = *b;
*b = newint;
主要代码:
using namespace std;
void swap(int *a, int *b);
void selectionSort(int arr[], int size);
void printArray(int arr[], int size);
int main() {
int arr[] = {20, 12, 10, 15, 2};
int size = sizeof(arr) / sizeof(arr[0]);
selectionSort(arr, size);
cout << "Sorted array in Acsending Order:\n";
printArray(arr, size);
}
// ================================================
// swap function to swap two element of the array
void swap(int *a, int *b){
int newint = *a;
*a = *b;
*b = newint;
}
// ================================================
// the selection function made of two main loop
void selectionSort(int arr[], int size) {
for (int i = 0; i < size - 1; i++) {
int min = i;
for (int j = i + 1; j < size; j++) {
if (arr[j] < arr[min])
min = j;
}
swap(&arr[min], &arr[i]);
}
}
// ================================================
// print function to show the final result
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
指针通过引用传递,这意味着,如果您在 function 中更改它,它也将在 function 调用之后更改。 喜欢:
int a=5;
setTo6(&a);//Implementation: *a=6
//a=6
另一方面,所有其他不是指针的参数都是按值传递的。 这意味着,如果您在 function 中更改它们,调用方将不会更改它们。
int a=5;
setTo6ByValue(a);//Implementation: a=6
//a=5
所以,考虑这两个交换函数:(1)
void swap(int *a, int *b){
int newint = *a;
*a = *b;
*b = newint;
}
(2)
void swap(int a, int b){
int newint = a;
a = b;
b = newint;
}
第一个会发生什么?
int a=5;//Address=0x1000
int b=6;//Address=0x1004
swap(&a,&b);
指针被传递给 function,之后,地址 0x1000(指向a
指针)的内容存储在newint
中。
*a = *b;
将地址0x1000
处的 int 设置为地址b
(0x1004) 处的值。
*b = newint;
将地址0x1004
处的 int 设置为newint
的值。
第二个会做什么?
int a=5;//Maybe in the r8 register
int b=6;//r9 register
swap(a,b);
我们将有以下汇编代码(实际上未优化):
mov $5, %r8 //int a = 5
mov $6, %r9 //int b = 6
//Setup registers (https://stackoverflow.com/a/2538212/13912132)
mov %r8, %rdi
mov %r9, %rsi
call swap // swap(a,b)
....
swap:
mov %rdi, %rax //int newint=a
mov %rsi, %rdi //a=b
mov %rax, %rsi //b=newint
ret //Return to caller
它们不会被更改,因为您只更改变量。
这两个概念被称为 Call-by-value 和 Call-by-reference。 这里进一步说明: https://www.guru99.com/call-by-value-vs-call-by-reference.html
a
和b
是指针,作为参数接收,它们的地址被传递。 它们就像手指。 例如,您用手指指向一个值,而我用手指指向另一个值。 当您打算交换我们指向的内容时,您需要指向我之前指向的位置,我需要指向您之前指向的位置。 你的建议是交换我们的手指。
或者,从技术上讲:您需要交换指针指向的值,而不是切换指针的 memory 位置。
另一个类比可能是关于地址。 你住在某个地址,我住在另一个地址。 如果我们交换我们的地址,那么你搬进我以前的地址,我搬进你以前的地址。 但是我们并没有将我们居住的房屋实际搬迁到我们的新地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.