插入排序的实现差异
Difference in implementation for Insertion Sort
我正在尝试用不同的语言实现不同的算法来练习编程。关于插入排序的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循环,或者这只是草率的编程?提前谢谢。
首先,为什么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;
}
}
相关文章:
- 这是插入排序的正确实现吗?
- 使用列表 STL 递归进行插入排序
- 列表 iter 不取消引用 使用列表进行插入排序
- 如何使插入排序更快?
- 插入排序的最小交换
- 如何在C++中实现气泡排序?
- 在实现合并排序代码时无法计算所有反转
- 实现 3 路分区以实现快速排序
- 双链表C++上的插入排序
- 如何在插入排序中使用 replace() 使语句变得不必要
- C++ 使用向量实现合并排序
- C++插入排序错误功能不起作用
- 如何在不通过插入排序更改原始矢量的情况下对 2D 矢量进行排序
- 插入排序打印错误的输出
- 从矢量末尾开始的插入排序
- 插入排序:我做错了什么?
- 自己的C++列表类实现(插入函数)出现问题
- 插入排序的实现差异
- 实现插入排序时出现分段错误
- 间隙插入排序实现