插入排序是一种简单直观的排序算法,其工作原理类似于我们整理扑克牌的过程。它通过将数据分为已排序和未排序两部分,依次将未排序部分的数据插入到已排序部分的正确位置上,从而实现整个数据的排序。以下是插入排序的详细步骤和代码实现:
插入排序的基本步骤
初始状态:
假设第一个元素已经排序好。
选择元素:
从第二个元素开始,依次选择每一个元素。
比较与移动:
将选择的元素与已排序部分的元素从后向前进行比较,找到合适的位置插入。
重复步骤:
重复上述步骤,直到所有元素都排序完毕。
插入排序的代码实现
C 代码实现
```csharp
using System;
class InsertionSort
{
static void Main(string[] args)
{
int[] array = { 5, 2, 4, 6, 1, 3 };
Console.WriteLine("原数组: " + string.Join(", ", array));
InsertionSortAlgorithm(array);
Console.WriteLine("排序后的数组: " + string.Join(", ", array));
}
static void InsertionSortAlgorithm(int[] array)
{
for (int i = 1; i < array.Length; i++)
{
int key = array[i];
int j = i - 1;
while (j >= 0 && array[j] > key)
{
array[j + 1] = array[j]; // 元素向后移动
j = j - 1;
}
array[j + 1] = key; // 插入关键字到正确位置
}
}
}
```
Python 代码实现
```python
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
while j >= 0 and key < arr[j]:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
arr = [12, 11, 13, 5, 6]
insertion_sort(arr)
print("排序后的数组:", arr)
```
Java 代码实现
```java
public class InsertionSort {
public static void main(String[] args) {
int[] array = {5, 2, 4, 6, 1, 3};
System.out.println("原数组: " + java.util.Arrays.toString(array));
insertionSort(array);
System.out.println("排序后的数组: " + java.util.Arrays.toString(array));
}
public static void insertionSort(int[] array) {
for (int i = 1; i < array.length; i++) {
int key = array[i];
int j = i - 1;
while (j >= 0 && array[j] > key) {
array[j + 1] = array[j]; // 元素向后移动
j = j - 1;
}
array[j + 1] = key; // 插入关键字到正确位置
}
}
}
```
插入排序的时间复杂度
最佳情况:O(n),当输入数组已经是排序好的情况下。
平均情况:O(n^2),当输入数组是随机的情况下。
插入排序是一种稳定的排序方法,适用于少量数据的排序。虽然它的平均时间复杂度为O(n^2),但它的实现简单,适合用于教学和小规模数据的排序。