我已经通过两种不同的方式看到了插入排序的实现,如下所示,
方法1:
for (int out = 1; out < numbers.length; out++) {
int temp = numbers[out];
int in = out - 1;
while (in >= 0 && numbers[in] > temp) {
numbers[in + 1] = numbers[in];
numbers[in] = temp;
in--;
}
}
方法2:
int S[] = { 20, 25, 10};
int N = S.length;
for (int i = 1; i < N; i++) {
int j = i - 1;
int temp = S[i];
while (j >= 0 && S[j] > temp) {
S[j + 1] = S[j];
j--;
}
S[j + 1] = temp;
}
但我无法理解为什么在第二种方法中交换是在while循环之外?是否有理由让它在while循环中出现?
答案 0 :(得分:0)
这两个版本功能相同。后者只是避免做一些不必要的工作。
在第一个版本中,以下作业
numbers[in] = temp;
如果循环继续,将在循环的下一次迭代中撤消。第二个版本注意到这个事实,并且在完成循环之前不需要恢复temp
。
答案 1 :(得分:0)
基本上它是相同的,但在第一个中,你只是将临时数字立即写入你复制到元素[in + 1]的那个。在第二个,你等到你的循环结束。所以这只是节省了一些时间。