【发布时间】:2023-02-05 23:48:51
【问题描述】:
直接插入排序的实现:
void insertion_sort(int a[], int n) {
for (int i = 1; i < n; i++) {
int key = a[i];
int j = i - 1;
while (j >= 0 && a[j] > key) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = key;
}
}
二分插入排序的实现:
void insertion_sort(int a[], int n) {
for (int i = 1; i < n; i++) {
int key = a[i];
int mid = upper_bound(a, a + i, key) - a;
for (int j = i - 1; j >= mid; j--) a[j + 1] = a[j];
a[mid] = key;
}
}
网上教程说二分插入排序比直接插入排序快,因为二分查找比顺序查找快,但我不这么认为。
直接插入排序虽然采用顺序查找,但是当找到插入位置时,元素已经移动了。但是二分插入排序需要花费O(log i)的时间去寻找插入位置,而且找到之后元素还没有移动。如果只看循环内部,二分插入排序比直接插入排序耗时多O(log i),那为什么那么多人说前者比后者快呢?
【问题讨论】:
标签: sorting binary-search insertion-sort