插入排序详解

插入排序是一种较常用的排序手段。这个算法的实现过程特别简单,我们举个例子就知道了。

比如一群身高不等的人站成一排,现在要求按照从矮到高次序排序。那么插入排序是这样做的:

从第二个人开始,依次往前走,直到前面的比自己矮位置,然后站在第一个比自己矮的人后面。有人会说万一前面还有比自己高的呢?注意,我们这里是从第二个开始的,也就是假设的每个人前面都是排好序的。

如果你还没有明白的话,我刚刚整好在bing上面搜到一个相应的图片来说明(真的很巧,居然有人和我举一样的例子,我发誓身高排序的例子是我瞎编的偷笑

































结合上面的图,你有没有理解呢?如果没有理解也没关系,下面再结合我的代码来看一下:


/*
 * insertSort.cpp
 *
 *  Created on: Dec 3, 2015
 *      Author: freestyle4568
 */
#include <iostream>
#include <vector>

using namespace std;

void insertSort(vector<int> &A)
{
	int length = A.size();
	for (int j = 1; j < length; j++) {
		int key = A[j];
		int i = j - 1;
		<pre name="code" class="cpp">         while (i >= 0 && A[i] > key) {
			A[i+1] = A[i];
			i--;
		}
		A[i+1] = key;
	}
}

void print(vector<int> &A)
{
	for (size_t i = 0; i < A.size(); i++)
		cout << A[i] << endl;
}

int main()
{
	size_t n = 0;
	cout << "input the numbers of array: ";
	cin >> n;
	vector<int> A(n, 0);
	for (size_t i = 0; i < n; i++)
		cin >> A[i];

	//print(A);

	insertSort(A);

	print(A);
	return 0;
} 

 
insertSort函数中就是一个完整的插排代码,是不是很短啊大笑 

注意:这里的插排是稳定排序。什么是稳定排序呢?就是相等的量在排完序以后前后顺序没有变!我们上面的insertSort函数中,有一个:

<span style="font-size:18px;">while (i >= 0 && A[i] > key)</span>

其中的A[i] > key就是决定是否稳定的。这里是只有前面的比自己大才继续,如果相等就排在后面,所以稳定。

如果A[i]>=key的话,那就不稳定了,这样所以相等值的前后顺序会颠倒过来。


插入排序的复杂度为O(n^2);

详细的推倒过程在算法导论上面,感兴趣的同学可以去看一下。

其实我们也能从有个嵌套循环大概看出来为n^2。不过这样不太准确,有的时候甚至会出错,有可能是nlogn。

下面简单看一下算法导论的课后题目:

第一题是运行结果:









第二题是要我们重写insertSort函数实现降序排序:

把A[i] > key中改成A[i] < key就可以了。


第三题是一个证明题,没什么意思,直接pass。

第四题是n位二进制整数加,其实也是个for循环,有兴趣的同学可以试一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值