下面是一个在C语言中实现插入排序算法的例子:
``
#include
void insertionSort(int arr[], int n) {
int i, key, j;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
/* Move elements of arr[0..i-1], that are
greater than key, to one position ahead
of their current position */
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Original array: ");
printArray(arr, n);
insertionSort(arr, n);
printf("Sorted array: ");
printArray(arr, n);
return 0;
}
```
在这段代码中,‘insertionSort’函数实现了插入排序算法。它从第二个元素开始遍历数组,并将每个元素插入已排序元素中的正确位置。函数的作用是打印数组中的元素。
在‘main’函数中,我们定义了一个包含一些值的数组‘arr’,计算数组‘n’的大小,然后调用‘insertionSort’函数对数组进行排序。最后,我们使用“printArray”函数打印原始和排序后的数组。
输出结果将是:
Original array: 64 34 25 12 22 11 90
Sorted array: 11 12 22 25 34 64 90
插入排序算法在最坏情况下的时间复杂度为O(n^2),但它在小数组或部分排序的数组上表现良好。
以下是插入排序算法的分步说明:
1. 从数组中的第二个元素(键)开始。假设第一个元素已经排序。
2. 将密钥与之前的元素进行比较。将大于键的元素向右移动,为插入键创建一个空间。
3. 重复第 2 步,直到找到键的正确位置或到达数组的开头。
4. 将钥匙插入排序顺序中的正确位置。
5. 对数组中的其余元素重复步骤 1-4,一次一个元素,直到对整个数组进行排序。
下面是一个示例,用于说明使用数组 [5, 2, 4, 6, 1, 3] 的插入排序算法:
1. 从第二个元素开始,即 2。将其与之前的元素 (5) 进行比较。由于 5 大于 2,我们将 5 向右移动。
数组:[2, 5, 4, 6, 1, 3]
2. 将键 (2) 与它之前的下一个元素 (4) 进行比较。由于 4 大于 2,我们将 4 向右移动。
数组:[2, 4, 5, 6, 1, 3]
3. 将键 (2) 与它之前的下一个元素 (5) 进行比较。由于 5 大于 2,我们将 5 向右移动。
数组:[2, 4, 5, 6, 1, 3]
4. 将键 (2) 与它之前的下一个元素 (6) 进行比较。由于 6 大于 2,我们将 6 向右移动。
数组:[2, 4, 5, 6, 1, 3]
5. 将键 (2) 与它之前的下一个元素 (1) 进行比较。由于 1 小于 2,我们将键 (2) 插入其正确位置。
数组:[1, 2, 4, 5, 6, 3]
6. 移动到下一个键,即 4。将其与之前的元素 (2) 进行比较。由于 2 小于 4,我们将键 (4) 插入其正确位置。
数组:[1, 2, 4, 5, 6, 3]
7. 对其余元素重复该过程,直到整个数组排序完毕。
数组:[1, 2, 3, 4, 5, 6]
在每次迭代中,数组的排序部分按一个元素扩展,未排序部分按一个元素收缩。此过程一直持续到对整个数组进行排序。