简单插入排序
2017-05-23 17:35
134 查看
简单插入排序
简单插入排序插入排序,是指将无序序列中的各元素依次插入到已经有序的线性表中。
原理
假设现在有一个有序列表 {a1,a2,...ak},要向其中插入一个新的元素an ,并且保证插入之后的列表也是有序的,那我们要做的就是从后向前找到第一个ai<=an,并把 an 放在 ai 后面。同样的,现在我们要对 {a1,a2,...an} 排序,我们可以先把 a1 插入到有序列表空集中形成新的列表,然后把a2插入到新的列表中,依次类推,直到N个元素都插入完毕。每次插入要保证形成的新列表也是有序的。
分析
初始数组 {43512}将4插入到空集中,完成后 4 3 5 1 2
将3插入到新列表,完成后 3 4 5 1 2
将5插入到新列表,完成后 3 4 5 1 2
将1插入到新列表,完成后 1 3 4 5 2
将2插入到新列表,完成后 1 2 3 4 5
代码
void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } void insertionSort(int* arr, int len) { for(int i = 1; i < len; i++) { //查询第一个小于等于要插入元素的元素 int j = i - 1; while(arr[j] > arr[i]) { j--; } if(j != i - 1) { int temp = arr[i]; //把从j+1到i位的元素都后移一位 for(int k = i - 1; k > j; k--) { arr[k + 1] = arr[k]; } //把要插入的元素放在j+1位 arr[j + 1] = temp; } } }
优化
可以将每个元素与前面有序列表比较的过程改成类似与冒泡排序比较的过程。ai 从 ai−1 向前比较,直到找到第一个小于等于它的元素。也就是说比较过程中,他经过的都是大于它的元素。我们可以让他每遇到一个大于它的元素,就和这个元素交换位置,这样他就可以一步一步的交换到正确的位置上。void insertionSort(int* arr, int len) { for(int i = 1; i < len; i++) { for(int j = i; j > 0 && arr[j - 1] > arr[j]; j--) { swap(arr + j - 1, arr + j); } } }
时间复杂度
在最坏情况下,我们假设每次新元素都是最小的,那么插入第一个元素时需要0次比较,插入第二个元素时需要1次比较,插入第三个元素时需要2次比较……插入第n个元素时需要n-1次比较。∑i=1n(i−1)=n(n−1)2
所以最坏情况的时间复杂度是O(n2)。
在最好的情况下,数组本来就是有序的,那么每插入一个元素,只需要和他前面相邻的元素进行比较就可以了,这种情况下时间复杂度是O(n)。
相关文章推荐
- 数据结构之排序算法一冒泡排序,直接插入排序,简单选择排序
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 冒泡 ,插入,折半插入,希尔,快速,简单选择等排序源码
- WPF对于xml的简单操作(下下)插入节点并排序
- 三种最简单的排序算法(直接插入排序、冒泡排序、简单选择排序)
- 简单插入排序
- 排序(二)简单选择排序、直接插入排序、希尔排序
- 四种简单的排序算法(插入、冒泡、选择排序、快速排序法)+汉诺塔算法
- 直接插入排序 一个简单示例
- set简单用法2 带排序的插入
- 简单排序总结:选择、插入、交换
- 插入排序的简单实现
- 冒泡,插入,折半插入,希尔,快速,简单选择排序的源代码总结
- 八大排序算法:简单插入排序、冒泡排序、希尔排序、快速排序、堆排序、归并排序等总结。
- 简单排序:冒泡、选择、插入
- 简单插入排序的C语言实现
- 直接插入排序 —— 简单排序
- 一个快速排序 和 直接插入排序 的简单 c程序
- 插入排序的简单实现
- 五、排序算法之简单算法——冒泡排序、简单选择排序和直接插入排序