插入排序是一种简单直观的排序算法,其基本思想是将待排序的数组分成已排序区间和未排序区间,每次从未排序区间中选择一个元素插入到已排序区间的合适位置。具体地,我们从未排序区间中选择一个元素,与已排序区间中的元素逐一比较,找到插入位置,然后将该元素插入到已排序区间的合适位置,最终完成排序。
下面是一个简单的插入排序的示例代码,以升序排序为例:
void insertion_sort(int arr[], int n) {
int i, j, temp;
for (i = 1; i < n; i++) {
temp = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > temp) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
}
在这个代码中,我们使用了两个循环来完成插入排序。外层循环控制待排序数组的每个元素,从第二个元素开始,到最后一个元素。内层循环用来将当前元素插入到已排序区间的合适位置。
具体地,对于当前元素arr[i],我们首先将其保存到一个临时变量temp中。然后,我们从i-1位置开始向前遍历已排序区间,如果当前位置的元素大于temp,则将当前元素后移一位,以便为temp腾出插入位置。一直向前遍历,直到找到一个位置j,使得arr[j] <= temp,此时我们将temp插入到j+1的位置。
重复上述步骤,直到待排序数组中的所有元素都被插入到已排序区间的合适位置。通过不断将元素插入已排序区间,我们最终可以得到一个有序的数组。
需要注意的是,在实际的代码实现中,我们可以使用更高效的方法来将当前元素插入到已排序区间的合适位置,例如二分查找等方法。这样可以减少比较的次数,从而提高排序的效率。