好好学习算法!
按照《算法导论》原书第2版的次序,首先是排序算法之插入排序。
插入排序很好理解,书上举的例子是打扑克时抓牌,从第一张开始,你每抓一张牌的时候都会将该牌插入到手上所有牌中的合适位置,比如按照习惯来说,我习惯把小牌(比如3啊4啊)都放在右侧,大牌(大王等)放在左侧,那我每次抓起一张新牌的时候眼睛就能迅速定位到该牌能插入到什么位置,当然我们用算法实现的时候这里必须通过比较实现,其实迅速定位只是我们人的眼睛和脑子默契配合而且高速运转的结果。废话不多说,上代码~
#include <stdio.h>
void insertion_sort(int a[], int n)
{
int i, j, key;
for(j = 1; j < n; j++)
{
key = a[j];
i = j - 1;
while(i >= 0 && a[i] > key)
{
a[i + 1] = a[i];
i--;
}
a[i + 1] = key;
}
}
int main()
{
int n, i;
int a[100];
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
insertion_sort(a, n);
for(i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}
insertion_sort中的过程主要是这样的
我们从第二张牌开始到最后一张牌都是一轮
每一轮相当于抓起一张牌
然后和手上已经排好序的牌从后往前进行比较,如果比自己大则向后挪,否则就找到了自己的位子,放进去就可以了。
讨论完插入排序的算法过程,接下来我们来看看算法的时间复杂度。
不难发现,插入算法的最佳情况就是输入数据已经排好序(这里指非降序排列),每一轮只需比较一次即可,因此时间复杂度是O(n)
在最差情况下,即输入数据是逆序(这里是指降序)时,每一轮都需要和前边所有已排好序的数据进行比较,因此时间复杂度是O(n2)