插入排序详解
2015-12-03 15:24
260 查看
插入排序是一种较常用的排序手段。这个算法的实现过程特别简单,我们举个例子就知道了。
比如一群身高不等的人站成一排,现在要求按照从矮到高次序排序。那么插入排序是这样做的:
从第二个人开始,依次往前走,直到前面的比自己矮位置,然后站在第一个比自己矮的人后面。有人会说万一前面还有比自己高的呢?注意,我们这里是从第二个开始的,也就是假设的每个人前面都是排好序的。
如果你还没有明白的话,我刚刚整好在bing上面搜到一个相应的图片来说明(真的很巧,居然有人和我举一样的例子,我发誓身高排序的例子是我瞎编的
)
结合上面的图,你有没有理解呢?如果没有理解也没关系,下面再结合我的代码来看一下:
insertSort函数中就是一个完整的插排代码,是不是很短啊
注意:这里的插排是稳定排序。什么是稳定排序呢?就是相等的量在排完序以后前后顺序没有变!我们上面的insertSort函数中,有一个:
其中的A[i] > key就是决定是否稳定的。这里是只有前面的比自己大才继续,如果相等就排在后面,所以稳定。
如果A[i]>=key的话,那就不稳定了,这样所以相等值的前后顺序会颠倒过来。
插入排序的复杂度为O(n^2);
详细的推倒过程在算法导论上面,感兴趣的同学可以去看一下。
其实我们也能从有个嵌套循环大概看出来为n^2。不过这样不太准确,有的时候甚至会出错,有可能是nlogn。
下面简单看一下算法导论的课后题目:
第一题是运行结果:
第二题是要我们重写insertSort函数实现降序排序:
把A[i] > key中改成A[i] < key就可以了。
第三题是一个证明题,没什么意思,直接pass。
第四题是n位二进制整数加,其实也是个for循环,有兴趣的同学可以试一下。
比如一群身高不等的人站成一排,现在要求按照从矮到高次序排序。那么插入排序是这样做的:
从第二个人开始,依次往前走,直到前面的比自己矮位置,然后站在第一个比自己矮的人后面。有人会说万一前面还有比自己高的呢?注意,我们这里是从第二个开始的,也就是假设的每个人前面都是排好序的。
如果你还没有明白的话,我刚刚整好在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循环,有兴趣的同学可以试一下。
相关文章推荐
- Fabrc
- 使用Eclipse自带的Maven插件创建Web项目时报错: Could not resolve archetype org.apache.maven.archetypes:maven-arche
- 关于张正友标定法
- Spring JdbcTemplate方法详解
- html高度随分辨度改变而改变
- JSP+Servlet 无数据库模拟登录过程
- Hive_6. 数据聚合 -- Group By & Grouping_SETS & RollUp & CUBE & Having
- webView实现图文混排
- 向上弹出菜单jQuery插件
- MySQL字符串函数:字符串截取
- css3是什么
- dTree JS 基本用法
- Android SlidingDrawer使用
- Oracle SQL实现分页查询
- ie9 提示'console' 未定义问题的解决方法
- log4j 配置详解
- log4j 配置详解
- log4j 配置详解
- log4j 配置详解
- log4j 配置详解