您的位置:首页 > 其它

插入排序详解

2015-12-03 15:24 260 查看
插入排序是一种较常用的排序手段。这个算法的实现过程特别简单,我们举个例子就知道了。

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

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

如果你还没有明白的话,我刚刚整好在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循环,有兴趣的同学可以试一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: