插入排序的实现差异

Difference in implementation for Insertion Sort

本文关键字:实现 插入排序      更新时间:2023-10-16

我正在尝试用不同的语言实现不同的算法来练习编程。关于插入排序的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;
    }
}