[每日一算法]排序之插入排序
来源:互联网 发布:海王星2.0软件下载 编辑:程序博客网 时间:2024/04/28 16:25
好好学习算法!
按照《算法导论》原书第2版的次序,首先是排序算法之插入排序。
插入排序很好理解,书上举的例子是打扑克时抓牌,从第一张开始,你每抓一张牌的时候都会将该牌插入到手上所有牌中的合适位置,比如按照习惯来说,我习惯把小牌(比如3啊4啊)都放在右侧,大牌(大王等)放在左侧,那我每次抓起一张新牌的时候眼睛就能迅速定位到该牌能插入到什么位置,当然我们用算法实现的时候这里必须通过比较实现,其实迅速定位只是我们人的眼睛和脑子默契配合而且高速运转的结果。废话不多说,上代码~
#include <stdio.h>void insertion_sort(int a[], int n){ int i, j, key; for(j = 1; j < n; j++) { key = a[j]; i = j - 1; while(i >= 0 && a[i] > key) { a[i + 1] = a[i]; i--; } a[i + 1] = key; }}int main(){ int n, i; int a[100]; scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d", &a[i]); insertion_sort(a, n); for(i = 0; i < n; i++) printf("%d ", a[i]); return 0;}
insertion_sort中的过程主要是这样的
我们从第二张牌开始到最后一张牌都是一轮
每一轮相当于抓起一张牌
然后和手上已经排好序的牌从后往前进行比较,如果比自己大则向后挪,否则就找到了自己的位子,放进去就可以了。
讨论完插入排序的算法过程,接下来我们来看看算法的时间复杂度。
不难发现,插入算法的最佳情况就是输入数据已经排好序(这里指非降序排列),每一轮只需比较一次即可,因此时间复杂度是O(n)
在最差情况下,即输入数据是逆序(这里是指降序)时,每一轮都需要和前边所有已排好序的数据进行比较,因此时间复杂度是O(n2)
0 0
- [每日一算法]排序之插入排序
- 每日实现一算法之插入排序
- 每日学算法(一):插入排序
- 数据结构<一> 排序算法之插入排序
- 每日一算法之快速排序
- 每日一算法之归并排序
- 每日一算法之计数排序
- 每日一题之排序算法专题
- 每日一算法之JS冒泡排序
- 每日一练(1)插入排序算法
- 每日一算法之直接插入排序的原理及实现
- 排序算法(一):插入排序
- 排序算法一:插入排序
- 算法一:插入排序
- 算法导论排序算法之插入排序(一)
- 每日一算法--快速排序
- <每日一算法>冒泡排序
- 【每日算法】插入排序&选择排序&冒泡排序
- 黑马程序员_Java基础[11]_单列设计模式
- 递归:求螺旋排列数字的矩阵
- HDU1019 Least Common Multiple
- 玩转html5(四)----使用canvas画一个时钟(可以动的哦!)
- poj 2488 A Knight's Journey
- [每日一算法]排序之插入排序
- 关于URL编码
- erlang在windows下和虚拟机节点通信
- linux网络编程二十三:高性能定时器之时间堆
- Java连接池总结复习及推荐
- POJ 1920 Towers of Hanoi
- 二叉树之中序线索
- It is not safe to rely on the system's timezone settings错误
- 动态规划 素数节点