插入排序
- 1.解释
- 2.步骤
- 3.举例分析
-
- 示例
- 结果
- 分析
1.解释
插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序)。
2.步骤
- 从第一个元素开始,该元素可以认为已经排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤2~5
如果排序序列是链表结构,插入排序可以实现在O(1)空间复杂度内完成排序。
3.举例分析
示例
c
#include <stdio.h>
// 插入排序函数
void in(int arr[], int n) {
int i, k, j;
for (i = 1; i < n; i++) {
k = arr[i];
j = i - 1;
// 将arr[0...i-1]中比k大的元素向后移动
while (j >= 0 && arr[j] > k) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = k;
}
}
// 用来打印数组的函数
void print(int arr[], int size) {
int i;
for (i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
// 主函数来演示排序过程
int main() {
int arr[] = {12, 11, 13, 5, 6};
int n = sizeof(arr)/sizeof(arr[0]);
in(arr, n);
print(arr, n);
return 0;
}
结果
分析
这段代码首先定义了一个in
函数,它接受一个整数数组和数组的长度。在in
函数中,通过一个for循环来遍历数组中的每个元素,将每个元素插入到已排序部分的正确位置。print
函数则用于打印排序后的数组。
插入排序在小规模数据或者基本有序的数据面前,这是一个非常有效的排序算法。在最好的情况下,即输入数组已经是排序好的。