插入排序
基本思想:
每次选择一个元素,并且将这个元素和整个数组中的所有元素进行比较,然后插入到合适的位置。
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
⒈ 从第一个元素开始,该元素可以认为已经被排序(先假定第一个待排序元素已排好序)
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5
图解
最初假定3为有序序列,把3以后的元素(例如5)依次和它前面的元素比较(对于5,前面只有3一个数字,只和3比较,5比3大,故比较后位置排在3后)。
时间复杂度
时间复杂度 O(n^2)且具有稳定性
代码实现
C语言
void insertion_sort(int arr[], int len){
2 int i,j,key;//i为序列中待排序元素的在序列中的初始序号
3 for (i=1;i<len;i++){
4 key = arr[i];//key为待排序元素数值
5 j=i-1;
6 while((j>=0) && (arr[j]>key))//当key前面还有元素需要比较(j>=0)并且此元素数值大于key
{
7 arr[j+1] = arr[j];//将该元素移到下一位置
8 j--;
9 }
10 arr[j+1] = key;//否则,将该元素插入
11 }
12 }
python
def insert_sort(lst):
n = len(lst)
if n == 1: return lst
for i in range(1,n):
for j in range(i, 0, -1):
if lst[j] < lst[j-1]:
lst[j], lst[j-1] = lst[j-1], lst[j]
else:
break
return lst
对于插入排序:交换次数和序列中逆序对的个数相同。每次交换只能消掉一个逆序对。
逆序对:对于下标
i
<
j
i<j
i<j 并且
d
a
t
a
[
i
]
>
d
a
t
a
[
j
]
data[i]>data[j]
data[i]>data[j],则
(
i
,
j
)
(i,j)
(i,j) 是一对逆序对。
时间复杂度:
T
(
N
,
I
)
=
O
(
N
+
I
)
T(N,I)=O(N+I)
T(N,I)=O(N+I)
如果序列整体有序,则插入排序简单高效!
ps:
该系列其他博文:
【排序】经典排序算法动画详解——堆排序C语言实现
【排序】经典排序算法动画详解——冒泡排序C语言实现
以上