算法导论笔记——排序——1插入排序

算法和数据结构需要一起学习,正在看《算法导论》这本经典著作,但是发现有很多东西都有点读不懂,所以希望通过写文章来分享自己的学习进程顺便解析一下这本书,所有的伪代码我都会使用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都可以忽略。最后的时间复杂度就为

到此,排序算法就介绍结束了,如果又不太懂的地方可以在评论区留言,大一小弟尽量解答。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值