繁体   English   中英

选择排序 | c++

[英]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

ab指针,作为参数接收,它们的地址被传递。 它们就像手指。 例如,您用手指指向一个值,而我用手指指向另一个值。 当您打算交换我们指向的内容时,您需要指向我之前指向的位置,我需要指向您之前指向的位置。 你的建议是交换我们的手指。

或者,从技术上讲:您需要交换指针指向的值,而不是切换指针的 memory 位置。

另一个类比可能是关于地址。 你住在某个地址,我住在另一个地址。 如果我们交换我们的地址,那么你搬进我以前的地址,我搬进你以前的地址。 但是我们并没有将我们居住的房屋实际搬迁到我们的新地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM