排序算法——插入排序
2016-06-01 10:55
162 查看
以前学习严蔚敏版的数据结构在博客也写过这个算法,现在回过头来看觉得当时思路有点混乱,写得比较复杂而且难理解,现在学习数据结构基础时重写一下,个人觉得数据结构基础比严蔚敏版的要好,因为分析得更加详细思路更清晰,也有完整代码,当然也可能是我第二次学习数据结构的原因。
插入排序的原理:
首先将线性表的第一个元素当成有序表,然后从第二个元素开始,依次插入到第有序表中完成排序。
例如,有数组 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]);
}
}
插入排序的原理:
首先将线性表的第一个元素当成有序表,然后从第二个元素开始,依次插入到第有序表中完成排序。
例如,有数组 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]);
}
}
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 插入排序
- 如何写好 C main 函数
- C#数据结构之顺序表(SeqList)实例详解
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法