算法和数据结构需要一起学习,正在看《算法导论》这本经典著作,但是发现有很多东西都有点读不懂,所以希望通过写文章来分享自己的学习进程顺便解析一下这本书,所有的伪代码我都会使用c++进行书写,希望大家能够以理解,并且现在本人才大一,可能有些数学公式不是很了解,讲的有可能有些不太对,可以指出错误。在这里发布的文章会尽量减少数学的推导,用代码来解释。
先简单的对插入排序做一个小解释,插入排序就有点像大家玩斗地主,当每次拿牌的时候,大家都会每次拿一张,将右手拿的那个单张按照顺序插入到左手的一副牌中。
这里我们使用Insert sort来命名这个函数,这里我是用一些书上的图像来解释这个排序算法
我们以升序为例,这里有一个数组A{5,2,4,6,1,3}
这里我们假设从第一个数开始是有序的,从这个数组中将第二个数组插入其中,经过第一次插入,将2插入只有5这个数字的有序数列,因为2比5小,所以2应该插入到5前面
插入之后就是这样,现在2,5是有序的数列了,现在再将4加入,4比5小,比2大,所以应该插入到2和5之间
接下来我就不再解释了,继续把图片画出来
再将1插入
最后将3插入
最终结果就应该是这样
书中一般都书写的是伪代码,这里我用c++翻译成实际代码
void InsertSort(int* a, int n) {
for (int i = 0; i < n - 1; i++) {
int end = i;
int tmp = a[end + 1];
while (end >= 0) {
if (a[end] > tmp) {
a[end + 1] = a[end];
end--;
}
else {
break;
}
}
a[end + 1] = tmp;
}
}
这是使用插入排序达到降序的代码,这里进行测试
int main() {
int a[] = { 5,2,4,6,1,3 };
InsertSort(a, 6);
for (int i = 0; i < 6; i++) {
cout << a[i] << " ";
}
return 0;
}
没有任何问题,现在再修改代码,将他变为升序
void InsertSort(int* a, int n) {
for (int i = 0; i < n - 1; i++) {
int end = i;
int tmp = a[end + 1];
while (end >= 0) {
if (a[end] < tmp) {
a[end + 1] = a[end];
end--;
}
else {
break;
}
}
a[end + 1] = tmp;
}
}
进行测试
既然知道了这样的算法,现在就来进行算法分析。
这里因为博主数学不算太好,就不推导数学公式了。这里假设最差情况,也就是所有数从大到小排序(我们想将他从小到大排序) 最后算出来之后可化简为一个二次函数
当我们需要排序的数字非常大 的时候后面的bn和c都可以忽略。最后的时间复杂度就为
到此,排序算法就介绍结束了,如果又不太懂的地方可以在评论区留言,大一小弟尽量解答。