gpt4 book ai didi

java - 插入排序的实现差异

转载 作者:行者123 更新时间:2023-11-28 00:07:54 24 4
gpt4 key购买 nike

我正在尝试通过使用不同语言实现不同算法来练习编程。我有两个关于插入排序的 C++ 实现的问题。首先,为什么大多数 C++ 实现都包含长度参数,而其他实现(例如 Java)仅在 for 循环中访问数组长度?下一个问题是为什么大多数实现在 while 循环内交换变量,而不是在最后交换?我已经包含了两个实现,以便于讨论。

Java 实现:

void insertionSort(int[] arr) {
int i, j, newValue;
for (i = 1; i < arr.length; i++) {
newValue = arr[i];
j = i;
while (j > 0 && arr[j - 1] > newValue) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = newValue;
}
}

C++ 实现:

void insertionSort(int arr[], int length) {
int i, j, tmp;
for (i = 1; i < length; i++) {
j = i;
while (j > 0 && arr[j - 1] > arr[j]) {
tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
j--;
}
}
}

由于 while 循环中的交换,c++ 实现的性能似乎会更差。具体来说,是否有 C++ 不直接访问数组大小的原因,是否有必要像那样实现 while 循环,或者它只是草率的编程?先感谢您。

最佳答案

First, why do most implementations in c++ include a length parameter, while others, such as java, just access the arrays length in the for loop?

C++ 没有任何直接方法/字段来访问数组的长度。在 Java 中,原始数组被视为对象并具有长度字段,可用于确定数组的长度。

The next question is why do most implementations swap the variable inside the while loop, instead of just swapping at the very end?

是否在循环中交换值完全取决于实现。您始终可以编写一个将移动元素的实现,然后最后将新元素放在正确的位置。这与任何特定的编程语言无关。


这是不在循环内进行交换的 C++ 实现。

void insertionSort(int arr[], int length) {
int i, j, newValue;
for (i = 1; i < length; i++) {
newValue = arr[i];
j = i;
while (j > 0 && arr[j - 1] > newValue) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = newValue;
}
}

关于java - 插入排序的实现差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34504121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com