插入排序

时间:2015-12-29 03:47:20

标签: java c++ insertion-sort

我正在尝试通过在不同语言中实现不同的算法来练习编程。关于插入排序的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循环,还是只是草率编程?先感谢您。

1 个答案:

答案 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;
    }
}
相关问题