我正在尝试通过在不同语言中实现不同的算法来练习编程。关于插入排序的c ++实现,我有两个问题。首先,为什么c ++中的大多数实现都包含一个length参数,而其他实现(如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--;
}
}
}
似乎c ++实现会因为while循环中的交换而表现更差。具体来说,有没有理由说c ++不能直接访问数组大小,还有必要像这样实现while循环,还是只是草率编程?先感谢您。
答案 0 :(得分:3)
首先,为什么c ++中的大多数实现都包含一个长度参数,而其他实现(如java)只是访问for循环中的数组长度?
C ++没有任何直接的方法/字段来访问数组的长度。在Java中,原始数组被视为对象并具有长度字段,可用于确定数组的长度。
接下来的问题是为什么大多数实现都会在while循环中交换变量,而不是仅仅在最后交换?
在循环中交换值是否与实现有关。您总是可以编写一个实现,它将移动元素,然后最终将新元素放在正确的位置。这与任何特定的编程语言无关。
这是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;
}
}