排序算法——插入排序
来源:互联网 发布:编程原本 pdf下载 编辑:程序博客网 时间:2024/06/06 01:45
以前学习严蔚敏版的数据结构在博客也写过这个算法,现在回过头来看觉得当时思路有点混乱,写得比较复杂而且难理解,现在学习数据结构基础时重写一下,个人觉得数据结构基础比严蔚敏版的要好,因为分析得更加详细思路更清晰,也有完整代码,当然也可能是我第二次学习数据结构的原因。
插入排序的原理:
首先将线性表的第一个元素当成有序表,然后从第二个元素开始,依次插入到第有序表中完成排序。
例如,有数组 5 4 3 2 1, 首先将5 看成有个有序数组,这时只有一个元素。
第一步: 将4 插入5前面,这时有序数组为 4 5,还有 3 2 1没插入
第二部:将3插入4 5 中,这时有序数组为 3 4 5, 还有 2 1
最后依次把 2 和1 插入完成排序。
上面举得例子是插入排序的最差情形,需要移动的次数最多, 时间复杂度为O(n^2),当表中数据项较少时据说是最快的排序方法。
由于在寻找插入位置时,相同的元素我们是不会去移动它位置的,因此插入排序是稳定排序。
可以分3步完成上述排序过程。
1. 寻找插入的位置。
2. 插入元素。
3. 从第二元素开始到最后一个,重复1,2
下面的实现方法将这个实现分成两个函数实现,看起来会更加简洁, 其实合起来写也差不多。
#include <stdio.h>
#define LENGTH 1000 //数组最大长度
typedef struct Element{
int key;
/*other field*/
}Element;
//将元素e,按照key插入到有序数组中,当前数组有序个数为i
void insert(Element arr[], int i, Element e)
{
if(i == LENGTH)
{
fprintf(stderr, "array is fulled.\n");
return;
}
//find the position
while(i >= 0 && e.key < arr[i].key)
{
arr[i+1] = arr[i];
i--;
}
//insert
arr[i+1] = e;
}
void insertSort(Element arr[], int n)
{
int i;
for(i = 1; i < n; i++)
{
insert(arr, i-1, arr[i]);
}
}
- 排序—插入排序算法
- 排序算法—插入排序
- 数据结构&算法实践—【排序|插入排序】插入排序
- 排序算法—插入排序之直接插入排序
- 排序算法1—插入排序、选择排序、冒泡排序
- 排序算法——插入排序(直接插入排序、折半插入排序、希尔排序)
- 排序算法——插入排序
- 排序算法——二分插入排序
- 排序算法之一——插入排序
- 排序算法——插入排序
- 排序算法——插入排序
- 排序算法总结——插入排序
- 经典算法排序——插入排序
- 算法之排序——插入排序
- 排序算法——插入排序
- 排序算法3——插入排序
- 排序算法——插入排序
- 排序算法——插入排序
- hdu5714 思维+区间内线段最
- 【刷题之路】二叉树上最远距离
- Recommendation Engine classification Intro
- 61. Rotate List
- Android-umeng 微博分享和回调问题
- 排序算法——插入排序
- Thread类的使用
- 配置Nginx实现负载均衡
- 自定义imageView
- ResultSet用法集锦
- 小白第一次在Xcode上配置git与github
- SFIT特征(四)
- react native常见的错误
- 一种快速收敛的自适应算法求解最小包围盒(OBB)