插入排序算法,也称为双指针排序算法,其基本思想是将序列分为已排序和未排序两部分,每次从未排序部分的第一个数开始,依次将其插入到已排序部分合适的位置中,使得已排序部分仍然保持有序。通俗地说,就是将每个数插入到排好序的序列中。
C++ 代码实现如下:
template<typename T>
void InsertionSort(T *arr, int N)
{
for (int i = 1; i < N; i++) {
T temp = arr[i]; // 临时存储当前值
int j = i - 1; // 已排序部分最后一个元素的下标
while (j >= 0 && arr[j] > temp) { // 找到插入位置
arr[j + 1] = arr[j]; // 移动元素
j--;
}
arr[j + 1] = temp; // 插入当前值
}
}
在这段代码中,我们使用了 for
循环遍历整个数组,从第 2 个元素开始,将当前元素插入到已排序部分的合适位置中。
首先,我们将当前元素的值存储在临时变量 temp
中。然后,使用双指针来找到当前元素在已排序部分中正确的位置。双指针中,j
变量表示已排序部分最后一个元素的下标,初始值为 i - 1
。
接下来,我们在已排序部分中向前逐一查找元素,直到找到第一个比当前元素小的位置 j
或者已经查找到了已排序部分的头部。在查找的过程中,我们使用简单的交换法来移动元素,即将 [j,j+1)
区间内的元素依次向后移动一个位置。
最后,我们将当前元素插入到正确的位置中(即 j+1
的位置),并继续处理下一个元素,直到整个数组都已经排序完毕。
需要注意的是,基于双指针的排序算法可以行优化,例如,可以使用二分查找等方法来加快查找速度;也可以使用希尔排序、归并排序等算法来进一步提高排序效率。